排序总结之高速排序
排序 总结 高速
2023-09-27 14:27:00 时间
简单介绍:
高速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比較。
在最坏状况下则须要Ο(n2)次比較,但这样的状况并不常见。其实。高速排序通常明显比其它Ο(n log n) 算法更快,由于它的内部循环(inner loop)能够在大部分的架构上非常有效率地被实现出来。高速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
步骤:
1 ,从数列中挑出一个元素,称为 "基准"
2 。又一次排序数列,全部元素比基准值小的摆放在基准前面,全部元素比基准值大的摆在基准的后面(同样的数能够到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。
这个称为分区(partition)操作。
3 。递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。尽管一直递归下去,可是这个算法总会退出,由于在每次的迭代(iteration)中。它至少会把一个元素摆到它最后的位置去。
复杂度:
数据结构 | 不定 |
---|---|
最差时间复杂度 | |
最优时间复杂度 | |
平均时间复杂度 | |
最差空间复杂度 | 依据实现的方式不同而不同 |
使用原地(in-place)分区的高速排序版本号。在不论什么递归调用前。仅会使用固定的额外空间。
然而。假设须要产生O(log n)嵌套递归调用,它须要在他们每个存储一个固定数量的信息。
由于最好的情况最多须要O(log n)次的嵌套递归调用,所以它须要O(log n)的空间。最坏情况下须要O(n)次嵌套递归调用,因此须要O(n)的空间。
java code:
package com.lxz.sort; import java.util.Arrays; public class QuickSortDemo { // 高速排序在交换元素时会导致相等元素相对位置改变所以是不稳定的 private void quickSort(int[] a, int left, int right) { if (left < right) { int mid = getMid(a, left, right); // int mid = getMid1(a, left, right); quickSort(a, left, mid - 1); quickSort(a, mid + 1, right); } } // 双指针单側向右移动交换。 private int getMid1(int[] a, int left, int right) { int origin = a[left]; int pos = left; for (int j = left + 1; j <= right; j++) { if (a[j] <= origin) { pos++; if (pos != j) {// 假设不等则前面遍历过的元素有小于origin的 int temp = a[j]; a[j] = a[pos]; a[pos] = temp; } } } a[left] = a[pos]; a[pos] = origin; return pos; } // 双指针两端向中间移动交换 private int getMid(int[] a, int left, int right) { int temp = a[left]; while (left < right) {// 这里有等号会导致死循环 while (left < right && temp <= a[right]) // left <= right等号会导致java.lang.ArrayIndexOutOfBoundsException right--; a[left] = a[right]; while (left < right && a[left] <= temp) left++; a[right] = a[left]; } a[left] = temp; return left; } public static void main(String[] args){ QuickSortDemo qsd = new QuickSortDemo(); int b[] = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51 }; // int b[] = { 8, 9, 6, 3, 4, 5, 2, 1, 7, 2, 12, 11, 15, 1 }; qsd.quickSort(b, 0, b.length - 1); System.out.println(Arrays.toString(b)); } }
參考文献:http://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F
相关文章
- php 数组时间排序 array_multisort
- 【学习笔记31】JavaScript冒泡排序和选择排序
- 【转】算法总结-这是一份全面并且详细的排序算法学习指南
- python中sort()和sorted()排序函数用法详解
- 35Vue - 显示过滤/排序结果
- v8引擎如何实现sort排序的?
- [LeetCode]26. 删除排序数组中的重复项
- 插入排序与希尔排序
- 408 | 【数据结构】 排序 —— 总复习框架总结
- 【排序算法(四)】归并排序&&计数排序(非比较排序)以及八大排序算法的总结
- 21天经典算法之直接选择排序
- HDU 1285--确定比赛名次【拓扑排序 && 邻接表实现】
- 综合8种子排序算法总结和比较
- 八大排序算法总结
- nyoj 8-一种排序 (贪心)
- mongodb-实战-聚合 组内排序
- 算法补天系列之——堆和桶(以及部分排序问题)