排序算法总结(此篇文章是14年写作,代码难看,请看我新发表的排序总结)
一张图表达排序算法的稳定性:
关于希尔排序:
这是对直接插入排序的改进,按照直接插入排序来理解会很容易。
关于堆排序:
首先个式子很重要:
我觉得研究堆排序,最直接的方法就是按层把树结构转化为数组。许多关于完全二叉树的算法这样想都会简单很多。
堆排序的算法就是:
构成大定队function()
循环中:堆顶记录和最后一个交换function()
重新构成大顶堆function()
构建大顶堆过程就是从n/2开始,到1,每个都与其左右子节点相比较,找到比自己大的且最大的子节点并交换。因为是从树的,下到上,所以最后构建的是大顶堆。
总结:堆排序是不稳定的。
由于初始构建堆所需比较次数较多,所以它不需要带排序序列length比较小的情况。
完全二叉树的深度log(2)n + 1……最后得出其时间复杂度O(nlogn)
归并排序:
归并排序在数学上还是用到了完全二叉树。O(nlogn)。归并排序是一种比较占内存但高效稳定的排序法。
关于快速排序:
如果用递归来做,很简单。就是不断找那个中枢,小于它的在一边,大于它的在一边。然后两边再分别找中枢。
快速排序的性能取决于递归树的深度。在最优情况下,是O(nlogn)(依然是完全二叉树的深度决定的)。最坏情况是O(n²)。平均情况O(nlogn)。数学归纳我也看不懂,先记住结论吧。
这个demo代码是去年写的。结构不好,测试代码和8个排序算法的function全部写在一起了。那几句测试用的代码其实写一遍就可以了,但去年的我写了8次。我的天。完全没有java该有的味道。懒于再重写了,这里重点是总结排序算法。实现代码什么的能看就行。
package day07; import java.util.Arrays; import java.util.Random; public class SortDemo { public static void main(String[] args) { Random ran = new Random(); int[] arr = new int[10]; for(int i = 0; i < arr.length; i++) { arr[i] = ran.nextInt(1000); } System.out.println(Arrays.toString(arr)); System.out.println("直接插入排序:"); InsertSort(arr,10); System.out.println(Arrays.toString(arr)); System.out.println("**********************************"); for(int i = 0; i < arr.length; i++) { arr[i] = ran.nextInt(1000); } System.out.println(Arrays.toString(arr)); System.out.println("二分排序:"); InsertSort2(arr,10); System.out.println(Arrays.toString(arr)); System.out.println("**********************************"); for(int i = 0; i < arr.length; i++) { arr[i] = ran.nextInt(1000); } System.out.println(Arrays.toString(arr)); System.out.println("希尔排序:"); ShellSort(arr,10); System.out.println(Arrays.toString(arr)); System.out.println("**********************************"); for(int i = 0; i < arr.length; i++) { arr[i] = ran.nextInt(1000); } System.out.println(Arrays.toString(arr)); System.out.println("简单选择排序:"); SelectSort(arr, 10); System.out.println(Arrays.toString(arr)); System.out.println("**********************************"); int[] arr1 = new int[11]; for(int i = 1; i < arr1.length; i++) { arr1[i] = ran.nextInt(1000); } for(int i = 1; i <= 10; i++) { System.out.print(arr1[i] + "\t"); } System.out.print("\n"); System.out.println("堆排序:"); HeapSort(arr1,10); for(int i = 1; i <= 10; i++) { System.out.print(arr1[i] + "\t"); } System.out.print("\n"); System.out.println("**********************************"); for(int i = 0; i < arr.length; i++) { arr[i] = ran.nextInt(1000); } System.out.println(Arrays.toString(arr)); System.out.println("冒泡排序:"); BubbleSort(arr,10); System.out.println(Arrays.toString(arr)); System.out.println("**********************************"); for(int i = 0; i < arr.length; i++) { arr[i] = ran.nextInt(1000); } System.out.println(Arrays.toString(arr)); System.out.println("快速排序:"); QuickSort(arr,0,9); System.out.println(Arrays.toString(arr)); System.out.println("**********************************"); for(int i = 0; i < arr.length; i++) { arr[i] = ran.nextInt(1000); } System.out.println(Arrays.toString(arr)); System.out.println("归并排序:"); MergeSort(arr,10); System.out.println(Arrays.toString(arr)); System.out.println("**********************************"); } /*******************************insert sort**************************/ public static void InsertSort(int[] R, int n) { int i,j,tmp; for(i = 1; i < n; i++) { tmp = R[i]; j = i - 1; while(j >=0 && tmp < R[j]) { R[j + 1] = R[j]; j--; } R[j + 1] = tmp; } } public static void InsertSort2(int[] R, int n) { int i,j; int tmp; int low,mid,high; for(i = 1; i < n; i++) { low = 0; high = i - 1; tmp = R[i]; while(low <= high) { mid = (low + high)/2; if(R[mid] < tmp) low = mid + 1; else high = mid - 1; } for(j = i - 1; j >= high + 1; j--) R[j + 1] = R[j]; R[high + 1] = tmp; } } /*****************************shell sort*****************************/ public static void ShellSort(int R[], int n) { int i,j,tmp,d; d = n / 2; while(d > 0){ for(i = d; i < n; i++) { tmp = R[i]; j = i - d; while(j >= 0 && tmp < R[j]) { R[j + d] = R[j]; j-=d; } R[j + d] = tmp; } d = d/2; } } /******************************select sort****************************/ public static void SelectSort(int R[], int n) { int i, k, j, tmp; for(i = 0; i < n - 1; i++) { k = i; for(j = i + 1; j < n; j++) { if(R[k] > R[j] ) k = j; } if(k != i) { tmp = R[i]; R[i] = R[k]; R[k] = tmp; } } } /****************************Heap sort********************************/ public static void Sift(int R[], int low, int high) { int i = low; int j = 2 * low; int tmp = R[i]; while(j <= high) { if(j < high && R[j + 1] > R[j]) j++; if(tmp < R[j]) { R[i] = R[j]; i = j; j = 2 * i; } else break; } R[i] = tmp; } public static void HeapSort(int R[], int n) { int i,tmp; for(i = n / 2; i >= 1; i--) Sift(R, i, n); for(i = n; i >= 2; i--) { tmp = R[1]; R[1] = R[i]; R[i] = tmp; Sift(R, 1, i - 1); } } /****************************bubble sort******************************/ public static void BubbleSort(int R[], int n) { int i,j,tmp; for(i = 0; i < n - 1; i++) { for(j = 0; j < n - i - 1; j++) { if(R[j] > R[j + 1]) { tmp = R[j]; R[j] = R[j + 1]; R[j + 1] = tmp; } } } } /*****************************quick sort*****************************/ public static void QuickSort(int R[],int s, int t) { int i = s, j = t; int tmp; if(s < t) { tmp = R[s]; while(i != j) { while(j > i && R[j] > tmp) j--; R[i] = R[j]; while(j > i && R[i] < tmp) i++; R[j] = R[i]; } R[i] = tmp; QuickSort(R, s, i - 1); QuickSort(R, i + 1, t); } } /******************************merge sort******************************/ public static void MergeSort(int[]R,int n) { int length; for(length = 1; length < n; length = 2 * length) MergePass(R,length,n); } public static void MergePass(int[] R,int length, int n) { int i; for(i = 0; i + 2 * length - 1 < n; i = i + 2 * length) Merge(R, i, i + length - 1, i + 2 * length - 1); if(i + length - 1 < n) Merge(R, i, i + length - 1,n - 1); } public static void Merge(int[] R, int low, int mid, int high) { int[] R1 = new int[high - low + 1]; int i = low, j = mid + 1,k = 0; while(i <= mid && j <= high) if(R[i] < R[j]) { R1[k] = R[i]; i++; k++; } else { R1[k] = R[j]; j++; k++; } while(i <= mid) { R1[k] = R[i]; i++; k++; } while(j <= high) { R1[k] = R[j]; j++; k++; } for(k = 0,i =low; i <= high; k++,i++) R[i] = R1[k]; } /************************************************************************/ }