当前位置:   article > 正文

Java实现七大排序(一)

Java实现七大排序(一)

目录

一.插入排序

1.直接插入排序

2.希尔排序

二.选择排序

1.选择排序

2.堆排序

三.总结


一.插入排序

1.直接插入排序

直接插入排序的原理与线下玩扑克牌类似。我们拿到一张牌后要排序,方法就是一张一张对。直接插入排序也是这样的,我们得到一张“牌”,从后往前对比,如果“牌”比刚得到的“牌”大就继续往前找,如果“牌”比刚得到的要小就插在它的后面。

  1. //直接插入排序
  2. public static void insetSort(int[] array){
  3. for(int i=1;i<array.length;i++){
  4. //从前往后遍历
  5. int j=i-1;
  6. int tem=array[i]; //当前i的值
  7. for(;j>=0;j--){
  8. if(array[j]>tem){
  9. //如果比tem大就继续往前找
  10. array[j+1]=array[j];
  11. }else{
  12. //如果比tem小就插在j的后面,也就是j+1的位置
  13. array[j+1]=tem;
  14. break;
  15. }
  16. }
  17. //如果找到头都没找到,说明其实最小的
  18. array[j+1]=tem;
  19. }
  20. }

特性:当数组越有序,时间效率越高。

2.希尔排序

又名缩小增量排序。希尔排序是直接插入排序的优化,其时间复杂度最坏就是直接插入排序。思路是先分小组,组内排序;再分组,但组内元素增多,组内排序,直到最后只分1组,这时再进行排序就有序了。

首先我们要解决这么分组的问题。

如图,正常我们想到的是第一种分组,将连续的几个元素分成一组。但希尔排序用的是第二种,定义一个gap,让前一个加上一个gap找到第二个。

前面说了希尔排序是直接插入排序的优化,其代码和直接插入排序极其相似。

  1. //希尔排序
  2. public static void shellSort(int[] array){
  3. int gap=array.length/2;
  4. //分组
  5. while(gap>1){
  6. gap=gap/2;
  7. shell(array,gap);
  8. }
  9. }
  10. //直接插入排序的变种
  11. private static void shell(int[] array, int gap) {
  12. for(int i=gap;i<array.length;i++){
  13. int j=i-gap;
  14. int tem=array[i];
  15. for(;j>=0;j-=gap){
  16. if(array[j]>array[j+gap]){
  17. array[j+gap]=array[j];
  18. }else{
  19. array[j+gap]=tem;
  20. break;
  21. }
  22. }
  23. array[j+gap]=tem;
  24. }
  25. }

二.选择排序

1.选择排序

选择排序的原理很简单,从前到后遍历每一个元素,再遍历这个元素后面的元素,找到后面比该元素更小的元素,交换其位置即可。

  1. public static void selectSort(int[] array) {
  2. for (int i = 0; i < array.length; i++) {
  3. int mindIndex = i;
  4. for (int j = i+1; j < array.length; j++) {
  5. if(array[j] < array[mindIndex]) {
  6. mindIndex = j;
  7. }
  8. }
  9. swap(array,i,mindIndex);
  10. }
  11. }

这种方式排序比较慢,我们可以对其进行优化,优化思路:同时排序大值和小值。

  1. public static void SelectSortOptimize(int[] array){
  2. int left=0;
  3. int right=array.length-1;
  4. while(left<right){
  5. int minIndex=left;
  6. int maxIndex=left;
  7. for (int i = left+1; i <= right; i++) {
  8. if(array[i]>array[maxIndex]){
  9. maxIndex=i;
  10. }
  11. if(array[i]<array[minIndex]){
  12. minIndex=i;
  13. }
  14. }
  15. swap(array,left,minIndex);
  16. if(maxIndex==left){
  17. //因为left已经被minIndex换走了
  18. maxIndex=minIndex;
  19. }
  20. swap(array,right,maxIndex);
  21. left++;
  22. right--;
  23. }
  24. }

2.堆排序

在堆排序中,要想升序排序要大根堆,要降序需要小根堆。思路:定义一个引用指向堆的最后一个元素,将堆顶元素与指向元素交换,然后指向向前移动,将堆顶元素进行向下调整。

  1. public static void heapSort(int[] array){
  2. createHeap(array);
  3. for(int i=array.length-1;i>0;i--){
  4. swap(array,0,i);
  5. siftdown(array,0,i);
  6. }
  7. }

三.总结

排序方法最好平均最坏空间复杂度稳定性
直接插入排序O(n)O(n^{2})O(n^{2})O(1)稳定
希尔排序O(n)O(n^{1.3-1.5})O(n^{2})O(1)不稳定
选择排序O(n^{2})O(n^{2})O(n^{2})O(1)不稳定
堆排序O(n*log(n))O(n*log(n))O(n*log(n))O(1)不稳定

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/876720
推荐阅读
相关标签
  

闽ICP备14008679号