经常用的排序算法
本博客是整理的百度百科方面的内容综合。
在每一种方法的介绍顶部,都有百度百科的直接链接(关于本方法的介绍,百度百科真的爱了,特别的全)


1.插入排序
1.直接插入排序
2.折半插入排序
插入排序是一种简单直观且稳定的排序算法。将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的序列。
(时间复杂度是O(n^2))
算法稳定性:插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有一个元素,就是第一个元素。比较是从有序序列的末尾开始的,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。想等元素的前后序列没有改变,从原无需序列出去的顺序就是排好后的顺序,所以插入排序是稳定的。
2.希尔排序
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
时间复杂度分析:
希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。
稳定性分析:
不稳定
3.冒泡算法
冒泡排序就是把小的元素往前调,把大的元素往后调
(排序算法最好的时间复杂度是O(n)最坏的时间复杂度是
,平均时间复杂度是
)
算法稳定性:冒泡排序就是把小的元素往前调,把大的元素往后调。比较的是相邻的两个元素比较,交换也是发生在两个元素之间。所以如果相邻的两个元素是相等的,是不会发生交换的。所以冒泡排序是一种稳定排序算法。
4.选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。
时间复杂度:
选择排序的交换操作介于 0 和 (n - 1) 次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。
稳定性:不稳定
5.堆排序
推荐一个方法:这个方法的博客地址
1)建立堆
2)得到堆顶元素为最大元素
3)去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序。
4)堆顶元素为最大元素。
5)重复步骤3,直到堆变空
时间复杂度:
堆排序的时间复杂度是nlogn级别。
稳定性:不稳定
6.快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然 后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

时间复杂度和堆排序一样nlogn级别。
稳定性不稳定
各个排序算法的代码编写
1.插入排序(java代码编写)
/***插入排序*@paramarr*@return*/private static int[] insertSort(int[]arr){if(arr == null || arr.length < 2){ return arr;}for(inti=1;i<arr.length;i++){for(intj=i;j>0;j--){if(arr[j]<arr[j-1]){//TODO:int temp=arr[j];arr[j]=arr[j-1];arr[j-1]=temp;//}else{//接下来是无用功break;}}}return arr;}public static void main(String [] args){ int[]a={49,38,65,97,76,13,27,49,78,34,12,64,1}; System.out.println("排序之前:"); for(int i=0;i<a.length;i++) { System.out.print(a[i]+" "); } //希尔排序 int d=a.length; while(true) { d=d/2; for(int x=0;x<d;x++) { for(int i=x+d;i<a.length;i=i+d) { int temp=a[i]; int j; for(j=i-d;j>=0&&a[j]>temp;j=j-d) { a[j+d]=a[j]; } a[j+d]=temp; } } if(d==1) { break; } } System.out.println(); System.out.println("排序之后:"); for(int i=0;i<a.length;i++) { System.out.print(a[i]+" "); } }3.冒泡算法(java代码编写)
public static void bubbleSort(int []arr) {
for(int i =1;i<arr.length;i++) { for(int j=0;j<arr.length-i;j++) { if(arr[j]>arr[j+1]) { int temp = arr[j]; arr[j]=arr[j+1] arr[j+1]=temp; } } }public static void selectionSort(int[] arr){ for (int i = 0; i < arr.length - 1; i++) { int min = i; for (int j = i + 1; j < arr.length; j++) { if (arr[min] > arr[j]) { min = j; } } if (min != i) { int tmp = arr[min]; arr[min] = arr[i]; arr[i] = tmp; } }}

浙公网安备 33010602011771号