排序算法比较
本文代码参考https://blog.csdn.net/zgrjkflmkyc/article/details/11639091
一、冒泡排序
1. 原理
2. 代码实现
1 public void bubbleSort(int[] ele) { 2 int len = ele.length; 3 //outer loop 4 for (int out = len - 1; out > 1; out--) { 5 //inner loop 6 for(int in = 0; in < out; in++) { 7 if (ele[in] > ele[in +1 ]) { 8 swap(ele[in], ele[in + 1]); 9 } 10 } 11 } 12 } 13 14 public void swap(int a, int b) { 15 16 int deliver = a; 17 a = b; 18 b = deliver; 19 } 20
3. 复杂度分析
交换次数的复杂度为O(n2),比较次数的复杂度为O(n2)。
二、选择排序
1. 原理
2. 代码实现
1 public void selectionSort (int[] ele) { 2 int len = ele.length; 3 int min = 0; 4 for (int out = 0; out < len - 1; out++) { 5 min = out; 6 for (int in = out + 1; in < len - 1; in++) { 7 if (ele[in] < ele[min]) { 8 min = in; 9 } 10 } 11 swap(ele[min],ele[out]); 12 } 13 14 } 15 16 public void swap(int a, int b) { 17 int mid = a; 18 a = b; 19 b = mid; 20 21 }
3. 复杂度分析
交换次数的复杂度为O(n)(由于只需要与最小值进行交换),比较次数的复杂度为O(n2)。
三、插入排序
1. 原理
2. 代码实现
1 public void insertSort(int[] ele) { 2 int len = ele.length; 3 //out表示未排序的最左端的元素 4 for (int out = 1; out < len; out++) { 5 int tmp = ele[out];//存储出列元素 6 //in从out处向左移动,直到元素不大于tmp 7 int in = out; 8 while (in > 0 && ele[in - 1] > ele[out]) { 9 ele[in-1] = ele[in]; 10 --in; 11 } 12 ele[in] = tmp; 13 } 14 15 }
3. 复杂度分析
比较次数的复杂度为O(n2),但是它比冒泡排序快近一倍,比选择排序也要快。
四、快速排序
1. 原理
2. 代码实现
/*-----------------------快速排序法--------------------------------------------- 在这个例子中,取中间的元素s作比较,同样的先得右找比s大的索引i,然后找比s小的 索引j,只要两边的索引还没有交会,就交换i 与j 的元素值,这次不用再进行轴的交换了, 因为在寻找交换的过程中,轴位置的元素也会参与交换的动作,例如: 41 24 76 11 45 64 21 69 19 36 首先left为0,right为9,(left+right)/2 = 4(取整数的商),所以轴为索引4的位置,比较的元素是 45,您往右找比45大的,往左找比45小的进行交换: 41 24 76* 11 [45] 64 21 69 19 *36 41 24 36 11 45* 64 21 69 19* 76 41 24 36 11 19 64* 21* 69 45 76 [41 24 36 11 19 21] [64 69 45 76] 完成以上之后,再初别对左边括号与右边括号的部份进行递回,如此就可以完成排序的目的。 --------------------------------------------------------------------------------*/
1 public void quicksort_2(int number[], int left, int right) { 2 int i, j, s, temp; 3 if(left < right) { 4 s = number[(left+right)/2]; 5 i = left - 1; 6 j = right + 1; 7 while(true) { 8 while(number[++i] < s) ; // 向右找 9 while(number[--j] > s) ; // 向左找 10 if(i >= j) 11 break; 12 temp=number[i]; 13 number[i]=number[j]; 14 number[j]=temp; 15 } 16 quicksort_2(number, left, i-1); // 对左边进行递回 17 quicksort_2(number, j+1, right); // 对右边进行递回 18 } 19 }
3. 复杂度分析
O(n*logn)
五、算法对比分析
1. 一般情形下几乎不使用冒泡排序,复杂度比较高。
2. 当交换相对于比较更加耗时的时候,可以采用选择排序。
3. 对于数据量比较小或者基本有序的情况,通常采用插入排序。
4. 对于数据量比较大的情形,通常采用快速排序。
六、总结