• 查找、排序算法


    一.有序数组的折半查找

    【步骤】

     ① low=0,high=length-1;     //初始值

     ② 当low>high时,返回查找失败信息

     ③ low<=high时,mid=(low+high)/2

         a.若key<a[mid],high=mid-1;    //查找在左半区

         b.若key>a[mid],low=mid+1;    //查找在右半区

         c.若key=a[mid],返回mid           //查找成功

    【算法实现】

    public int binarySearch(int[] a,int key) {
        int len=a.length;
        int low=0;
        int high=len-1;
        while(low<=high) {
            int mid=(low+high)/2;     
            if(a[mid]<key) {            //在右半区
                low=mid+1;    
            }else if(a[mid]>key) {   //在左半区
                high=mid-1;         
            }else {
                return mid;       //查找成功
            }  
        }
        return -1;             //查找失败
    }
    
    another:
    
    public int binarySearch(int[] nums,int left,int right,int target) {
        if(left<=right) {
           int mid=(left+right)/2;
           if(nums[mid]==target)
               return mid;
           else if(nums[mid]<target) 
               return binarySearch(nums,mid+1,right,target);
           else
               return binarySearch(nums,left,mid-1,target);     
        }else {
           return -1;    
        }    
    } 


     

    二.快速排序

    【基本思想】

    1.选择一个基准元素,通常选择第一个或者最后一个元素

    2.通过一趟排序将待排序的记录分成两个部分,其中一部分都比基准元素小,另一部分都比基准元素大

    3.将基准元素放在排好序的正确位置

    4.分别对两部分采取同样的排序,直到整个记录有序

    【算法实现】

    //完成一趟排序,并返回基准元素所在的索引
    public int partition(int[] A,int low,int high) {
        int pivotKey=A[low];
        while(low<high) {
            while(low<high&&pivotKey>A[high])
                 high--;
            if(low<high)
    A[low++] = A[high];
    while(low<high&&pivotKey<A[low]) low++; if(low<high)
    A[high--] = A[low]; }
    A[low] = pivotKey;
    return low; } //快速排序 public void quickSort(int[] A,int low,int high) {
      if(left<right) {
          int pivot=partition(A,low,high);
           quickSort(A,low,pivot-1);
           quickSort(A,pivot+1,high); 
      }
    }

     三.归并排序

    【算法实现】

    public void mergeSort(int[] a,int left,int right) {
        if(left>=right)      
           return;
        int mid=(left+right)/2;
        mergeSort(a,left,mid);
        mergeSort(a,mid+1,right);
        merge(a,left,mid,right);  
    }
    
    public void merge(int[] a,int left,int mid,int right) {
        int tempArr=new int[a.length];
        int temp=left;
        int first=left;
        int second=mid+1;
        while(first<=mid&&second<=right) {
            if(a[first]<=a[second])
                 tempArr[temp++]=a[first++];
            else
                 tempArr[temp++]=a[second++];
        }
        while(first<=mid)
            tempArr[temp++]=a[first];
        while(second<=right)
            tempArr[temp++]=a[second++];
        while(left<=right) {
            a[left]=tempArr[left++];    
        }
    }
  • 相关阅读:
    ADO.NET Entity Framework之ObjectQuery
    高效byte[]和string互转的方法
    异步邮件发送
    ADO.NET Entity Framework之ObjectContext
    【转】Memcache and Mongodb
    一周工作总结一次SQL优化记录
    Ubuntu下有关Java和数据库的一些工作记录(一)
    自定义函数,替换字符串中指定位置的字符
    一次优化记录
    对比shrink和move
  • 原文地址:https://www.cnblogs.com/hwu2014/p/4442612.html
Copyright © 2020-2023  润新知