[数据结构] 快速排序

基本思想

  快速排序(Quicksort)是对冒泡排序的一种改进,又称划分交换排序(partition-exchange sort。

  快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

步骤为:

①.从数列中挑出一个元素,称为”基准”(pivot)

②.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

③.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序

 

使用快速排序法对一列数字进行排序的过程

排序效率

  在平均状况下,排序n个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n)算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

最差时间复杂度 Ο(n^2) 

最优时间复杂度 Ο(n log n) 

平均时间复杂度Ο(n log n) 

最差空间复杂度 根据实现的方式不同而不同

Java实现

public static void main(String[] args) {
        int [] arr = {8,1,0,4,6,2,7,9,5,3};
        quickSort(arr,0,arr.length-1);
        for(int i :arr){
            System.out.println(i);
        }
    }
    public static void quickSort(int[]arr,int low,int high){
         if (low < high) {
             int middle = getMiddle(arr, low, high);
              quickSort(arr, low, middle - 1);
             quickSort(arr, middle + 1, high);
          }
    }
    public static int getMiddle(int[] list, int low, int high) {
        int tmp = list[low];
        while (low < high) {
            while (low < high && list[high] >= tmp) {
                high--;
            }
            list[low] = list[high];
            while (low < high && list[low] <= tmp) {
                low++;
            }
            list[high] = list[low];
        }
       list[low] = tmp;
       return low;
    } 

运行结果:

分析:

取8为中值,红色箭头表示low,绿色箭头表示high

①从high开始向前扫描到第一个比8小的值与8交换。

②从low向后扫描第一比8大的值与8交换。

③重复①②过程只到,high=low完成一次快速排序,然后递归子序列。

时间: 2024-12-25 18:26:24

[数据结构] 快速排序的相关文章

数据结构---快速排序 &nbsp; java

快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 设要排序的数组是A[0]--A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过

数据结构-快速排序(C#实现)

快速排序的主要思路: 1.在数组首尾处各设一个标记 2.取出数组第一个值作为中枢值 3.所有数据跟中枢值比较:比中枢值小的放中枢值左边,首部标记++往右推一位,大的放中枢值右边,尾部标记--往左推一位(从小到大排序) 4.先从尾部开始与中枢值比较,如果尾部标记的值比中枢值大直接把标记往左推一位,如果尾部标记比中枢值小就把尾部标记的值放到首部标记的位置,然后开始从首部开始与中枢值比较,如果首部标记的值比中枢值小直接把标记往右推一位,如果首部标记比中枢值大就把首部标记的值放到尾部标记的位置,一直循环

数据结构——快速排序算法

今天来说一说快速排序: 基本思想: 任取一个元素 (如第一个) 为轴点 所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表 对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个 注意: 每一趟的子表的形成是采用从两头向中间交替式逼近法 由于每趟中对各子表的操作都相似,可采用递归算法 代码实现: #include <iostream> using namespace std; //找到第一个轴点,以这个轴点为界,将待排序的数组划分为 //[low,pivot),[pi

数据结构-快速排序算法

一趟快速排序的算法是: 1)设置两个变量i.j,排序开始的时候:i=0,j=N-1: 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]: 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换: 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换: 5)重复第3.4步,直到i=j: (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于ke

[golang] 数据结构-快速排序

快速排序是个非常经典.高效.常用的排序算法.很多语言标准库里的排序算法都有用到它. 原理快排原理其实比较简单,就是将原本很大的数组拆成小数组去解决问题.要拆就得找个拆的位置.如果吧这个位置称为支点,那么快速排序问题就变成了不断的去找到拆分的支点元素位置.通常找支点就是以某个元素为标准,分别从最右侧元素向左找到比指定元素小的位置,再从最左侧开始向右找比指定元素大的位置.如果两个位置不相同就交换两个位置,在继续分表从两头相向寻找.找到合适的位置就是我们需要的支点.支点两边的元素再各自重复上面的操作,

python算法与数据结构-快速排序(36)

一.快速排序的介绍 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 二.快速排序的原理 从数列中挑出一个元素,称为"基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同

java - 数据结构 - 快速排序

- -网上找结果很多都是无法排序有重复数据的,因此查了查资料写个改良版 百度百科: 快速排序算法通过多次比较和交换来实现排序,其排序流程如下: (1)首先设定一个分界值,通过该分界值将数组分成左右两部分. (2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边.此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值. (3)然后,左边和右边的数据可以独立排序.对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,

常见前端深度问题

1.数据结构 快速排序的原理,时间复杂度2.js的事件委托原理. window.onload = function(){ var oUl = document.getElementById("ul1"); oUl.onclick = function(ev){ var ev = ev || window.event; var target = ev.target || ev.srcElement; if(target.nodeName.toLowerCase() == 'li'){ a

Summary

PDF 暑假开始准备转移博客,试了几个都不怎么满意(我还去试了下LineBlog 不知道那时候在想什么..) 现在暂时转移至WordPress,不过还在完善中,预计..算了不瞎预计的好.. 课上说最好做个代码集,嗯嗯 我也觉得挺有必要的 毕竟现在我连Floyd怎么写都忘了 无脑SPFA_(:з」∠)_ 反正有用没用都稍微写一下,暂定是目录这些,有些还在找例题.整理代码什么的,所以还是空的. GItHub上还欠了几题,之后会补上来. 我做的二级目录到博客园就被无视了,,将就看看吧 感觉实在简陋了些