常见的算法 二分法查找 冒泡排序 快速排序

private static int binarySearch(int[] list,int target) {
        int low = 0;
        int high = list.length - 1;
        //直到low>high时还没找到关键字就结束查找,返回-1
        while(low<=high){
        int mid = (low+high) / 2;
        if(target < list[mid]){
            high = mid - 1;
        }
        else if(target > list[mid]){
            low = mid + 1;
        }
        else if(target == list[mid]){
            return mid;
            }
        }
        return -1;
    }

冒泡排序

public static void bubbleSort(int[] arr) {
     /*
     * 外面的for循环决定一个长度为 n 的数据要比较多少轮才能完成排序。
     * 里面的for循环决定每次一轮循环中要做多少次才能结束。
     */
     for(int i = 0; i < arr.length - 1; i++) {
         for(int j = 0; j < arr.length - 1 - i; j++){
             //从小到大,大的值放后面位置。 
             if (arr[j] > arr[j+1]){
                int temp = arr[j]
                arr[j] = arr[j + 1]
                arr [j + 1] = temp 
             }
         }
     } 
}

快速排序

基本思想是将要排序的数据分割成独立的两部分 ,其中一部分的所有数据都比另外一部分的所有数据都要小 ,然后在按照此方法对两部分数据分别进行快速排序 ,最终得到一个有序的序列。

private static void quickSort(int[] a, int low, int high) {  
        //找到递归算法的出口  
        if( low > high) {
            return;
        }
        int i = low;  
        int j = high;  
        //默认 key
        int key = a[low];  
        //开始一趟排序
        while( i < j) {
            //先从右往左找到第一个小于 key 的数 ,
            //这么做是因为在与 key 值交换的时候,保证了交换的数小于现有的 key 值
            //若是大于的话,j 指针就会继续向左移动 。
            while(i<j && a[j] > key){  
                j--;  
            }
            //从左往右找到第一个大于等于 key 的数  
            while( i<j && a[i] <= key) {  
                i++;  
            }
            //交换,达到以 key “分治” 的效果
            if(i<j) {
                int temp = a[i];  
                a[i] = a[j];  
                a[j] = temp;  
            }  
        }
        // 当 i = j 时,调整 key 的值为 a[i] == a[j]  
        int temp = a[i];  
        a[i] = a[low];  
        a[low] = temp;  
        //对 key 左边的数快速排序
        quickSort(a, low, i-1 );  
        //对 key 右边的数快速排序  
        quickSort(a, i+1, high);  
}

快速排序原理示例

假设要排的数组为:int[] a = { 5 2 8 9 2 3 4 9 };

选择 key = 5, 开始时 i = 0,j = 7

下标         0    1    2    3    4    5    6    7

开始         5    2    8    9    2    3    4    9
            i                                  j  

第一次找     5    2    8    9    2    3    4    9
                      i                   j

交换:       5    2    4    9    2    3    8    9 
                      i                   j

第二次找     5    2    4    9    2    3    8    9
                           i         j

交换:       5    2    4    3    2    9    8    9
                           i         j

第三次找     5    2    4    3    2    9    8    9
                               ij

调整key:    2    5    4    3    5    9    8    9
                               ij