常见排序算法

2020-07-21  本文已影响0人  fengyongge

时间复杂度和空间复杂度

对比.png

排序分类以及时间复杂度

类型 排序方法 时间复杂度-平均情况 时间复杂度-最好情况 时间复杂度-最坏情况 空间复杂度 稳定性
插入排序 直接插入 O(n^2) O(N) O(n^2) O(1) 稳定
插入排序 shell(希尔)排序 O(n^2) O(N) O(n^2) O(1) 不稳定
选择排序 直接选择 O(n^2) O(n^2) O(n^2) O(1) 不稳定
选择排序 堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不稳定
交换排序 冒泡排序 O(n^2) O(N) O(n^2) O(1) 稳定
交换排序 快速排序 O(nlogn) O(nlogn) O(n^2) O(nlogn) 不稳定
归并排序 快速排序 O(nlogn) O(nlogn) O(nlogn) O(1) 稳定

快速排序(挖坑埋数 + 分治法)

blog参考

   void quick_sort(int s[], int l, int r)
    {
        if (l < r)
        {
            int i = l, j = r, x = s[l];
            while (i < j)
            {
                while(i < j && s[j] >= x) {// 从右向左找第一个小于x的数
                    j--;
                }
                if(i < j) {
                    s[i++] = s[j];
                }

                while(i < j && s[i] < x) {// 从左向右找第一个大于等于x的数
                    i++;
                }
                if(i < j) {
                    s[j--] = s[i];
                }
            }
            s[i] = x;
            quick_sort(s, l, i - 1); // 递归调用 
            quick_sort(s, i + 1, r);
        }
    }

冒泡排序


 void bubbleSort(int arr[]){

       if(arr==null || arr.length < 2 ){
           return;
       }

       for (int i = 0; i < arr.length; i++) {
           for (int j = 0; j < arr.length - i - 1 ; j++) {
               if(arr[j] > arr[j+1]){
                   int temp = arr[j];
                   arr[j] = arr[j+1];
                   arr[j+1] = temp;
               }
           }
       }

   }

三色旗问题

blog参考

上一篇 下一篇

猜你喜欢

热点阅读