加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

十大经典排序算法总结(含Java代码实现)

发布时间:2019-08-28 16:30:18 所属栏目:优化 来源:佚名
导读:最近几天在研究排序算法,看了很多博客,发现网上有的文章中对排序算法解释的并不是很透彻,而且有很多代码都是错误的,例如有的文章中在桶排序算法中对每个桶进行排序直接使用了Collection.sort()函数,这样虽然能达到效果,但对于算法研究来讲是不可以的

6.3 代码实现

  1. /** 
  2.  * 快速排序方法 
  3.  * @param array 
  4.  * @param start 
  5.  * @param end 
  6.  * @return 
  7.  */ 
  8.  public static int[] QuickSort(int[] array, int start, int end) { 
  9.  if (array.length < 1 || start < 0 || end >= array.length || start > end) return null; 
  10.  int smallIndex = partition(array, start, end); 
  11.  if (smallIndex > start) 
  12.  QuickSort(array, start, smallIndex - 1); 
  13.  if (smallIndex < end) 
  14.  QuickSort(array, smallIndex + 1, end); 
  15.  return array; 
  16.  } 
  17.  /** 
  18.  * 快速排序算法——partition 
  19.  * @param array 
  20.  * @param start 
  21.  * @param end 
  22.  * @return 
  23.  */ 
  24.  public static int partition(int[] array, int start, int end) { 
  25.  int pivot = (int) (start + Math.random() * (end - start + 1)); 
  26.  int smallIndex = start - 1; 
  27.  swap(array, pivot, end); 
  28.  for (int i = start; i <= end; i++) 
  29.  if (array[i] <= array[end]) { 
  30.  smallIndex++; 
  31.  if (i > smallIndex) 
  32.  swap(array, i, smallIndex); 
  33.  } 
  34.  return smallIndex; 
  35.  } 
  36.  /** 
  37.  * 交换数组内两个元素 
  38.  * @param array 
  39.  * @param i 
  40.  * @param j 
  41.  */ 
  42.  public static void swap(int[] array, int i, int j) { 
  43.  int temp = array[i]; 
  44.  array[i] = array[j]; 
  45.  array[j] = temp; 
  46.  } 

6.4 算法分析

最佳情况:T(n) = O(nlogn) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(nlogn)

7、堆排序(Heap Sort)

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序:堆排序

7.1 算法描述

将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;

将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];

由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

7.2 动图演示

十大经典排序算法最强总结(含JAVA代码实现)

7.3 代码实现

注意:这里用到了完全二叉树的部分性质:

http://www.cnblogs.com/guoyaohua/p/8595289.html

  1. //声明全局变量,用于记录数组array的长度; 
  2. static int len; 
  3.  /** 
  4.  * 堆排序算法 
  5.  * 
  6.  * @param array 
  7.  * @return 
  8.  */ 
  9.  public static int[] HeapSort(int[] array) { 
  10.  len = array.length; 
  11.  if (len < 1) return array; 
  12.  //1.构建一个最大堆 
  13.  buildMaxHeap(array); 
  14.  //2.循环将堆首位(最大值)与末位交换,然后在重新调整最大堆 
  15.  while (len > 0) { 
  16.  swap(array, 0, len - 1); 
  17.  len--; 
  18.  adjustHeap(array, 0); 
  19.  } 
  20.  return array; 
  21.  } 
  22.  /** 
  23.  * 建立最大堆 
  24.  * 
  25.  * @param array 
  26.  */ 
  27.  public static void buildMaxHeap(int[] array) { 
  28.  //从最后一个非叶子节点开始向上构造最大堆 
  29.  for (int i = (len/2 - 1); i >= 0; i--) { //感谢 @让我发会呆 网友的提醒,此处应该为 i = (len/2 - 1)  
  30.  adjustHeap(array, i); 
  31.  } 
  32.  } 
  33.  /** 
  34.  * 调整使之成为最大堆 
  35.  * 
  36.  * @param array 
  37.  * @param i 
  38.  */ 
  39.  public static void adjustHeap(int[] array, int i) { 
  40.  int maxIndex = i; 
  41.  //如果有左子树,且左子树大于父节点,则将最大指针指向左子树 
  42.  if (i * 2 < len && array[i * 2] > array[maxIndex]) 
  43.  maxIndex = i * 2; 
  44.  //如果有右子树,且右子树大于父节点,则将最大指针指向右子树 
  45.  if (i * 2 + 1 < len && array[i * 2 + 1] > array[maxIndex]) 
  46.  maxIndex = i * 2 + 1; 
  47.  //如果父节点不是最大值,则将父节点与最大值交换,并且递归调整与父节点交换的位置。 
  48.  if (maxIndex != i) { 
  49.  swap(array, maxIndex, i); 
  50.  adjustHeap(array, maxIndex); 
  51.  } 
  52.  } 

7.4 算法分析

最佳情况:T(n) = O(nlogn) 最差情况:T(n) = O(nlogn) 平均情况:T(n) = O(nlogn)

8、计数排序(Counting Sort)

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!