各种排序算法总结

Posted lightning1992

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了各种排序算法总结相关的知识,希望对你有一定的参考价值。

 
排序算法时间复杂度(最好)时间复杂度(最坏)时间复杂度(平均)空间复杂度稳定性
冒泡排序 O(N) O(N2) O(N2) O(1) 稳定
选择排序 O(N2) O(N2) O(N2) O(1) 不稳定
插入排序 O(N) O(N2) O(N2) O(1) 稳定
希尔排序 取决于增量序列 O(N2) 取决于增量序列 O(1) 不稳定
快速排序 O(N2) O(NlogN) O(NlogN) O(logN) 不稳定
归并排序 O(NlogN) O(NlogN) O(NlogN) O(N)

稳定

堆排序 O(NlogN) O(NlogN) O(NlogN) O(1) 不稳定
计数排序          
桶排序          

 

 

 

 

 

 

 

 

 

 


 

泡排序

冒泡排序是不断比较相邻两个元素,并不断交换,最后把大的放到数组后面。第一趟遍历会把最大的元素放到(n-1)位置,第二趟遍历会把第二大的元素放到(n-2)的位置,以此类推。

public int[] sortArray(int[] nums) {
   for(int i = 0; i < nums.length - 1; i++) {
       boolean isSorted = true;
       for(int j = 0; j < nums.length - i - 1; j++){
           if(nums[j] > nums[j + 1]) {
               swap(nums, j, j + 1);
               isSorted = false;
          }
      }
       if(isSorted)
           break;
  }
   return nums;
}
?
private void swap(int[] nums, int i, int j){
   int tmp = nums[i];
   nums[i] = nums[j];
   nums[j] = tmp;
}
?

最好的情况是当数组有序,跑一次内存循环(时间复杂度为O(N))后,因为isSortedtrue,外层循环直接退出。所以时间复杂度为O(N)。

 

选择排序

选择排序要进行N-1趟,每次把当前最小的元素放到数组左边。第p趟过后,数组第0到第p-1都是有序的。

 

插入排序

跟玩扑克牌的时候,整理牌的操作很像。

插入排序由N-1趟排序组成。在第p趟,我们将位置p上的元素不断和它左边的元素比较,直到把这个元素放在合适的位置。第p趟排序之后,数组的第0至第p位置上的元素变为已排序状态。

public int[] sortArray(int[] nums) {
   for(int p = 1; p < nums.length; p++){
       int tmp = nums[p];
       int j;
       for(j = p - 1; j >= 0 && tmp < nums[j]; j--)
           nums[j + 1] = nums[j];
       nums[j + 1] = tmp;
  }
   return nums;
}

最好的情况是当数组有序,内层循环立即不成立而终止,所以时间复杂度为O(N)。

 

希尔排序

希尔排序是基本的插入排序的改进。它有一个增量序列,如1, 3, 5...

在使用增量序列hk排序后,对于每一个i都有nums[i] <= nums[i + hk]。

 

归并排序

 

 

 

 

Leetcode 912. Sort an Array, 你可以用你学过的所有的排序算法来做一下这道题。

 

 

以上是关于各种排序算法总结的主要内容,如果未能解决你的问题,请参考以下文章

各种排序算法总结

各种排序算法分析总结(待整理))

各种排序算法总结篇(高速/堆/希尔/归并)

排序算法总结(C++版本)

C++ 各种排序算法总结

排序算法总结