zoukankan      html  css  js  c++  java
  • 常见的算法

    二分法查找

    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
  • 相关阅读:
    CF799B T-shirt buying
    luogu3469 [POI2008]BLO_Blockade
    luogu2746 校园网
    USACO 2.2 Party Lamps 【高能等效+规律枚举】
    USACO 2.2 Subset Sums 【经典的方案DP+必要的转化】
    USACO 2.2 Preface Numbering 【实质是分治思想】
    bzoj 1051: [HAOI2006]受欢迎的牛 (Tarjan 缩点)
    bzoj 1088: [SCOI2005]扫雷Mine
    bzoj 2761: [JLOI2011]不重复数字 (map||Treap)
    bzoj 1230: [Usaco2008 Nov]lites 开关灯
  • 原文地址:https://www.cnblogs.com/niudaben/p/11928119.html
Copyright © 2011-2022 走看看