快速排序 代码

参考:http://www.cnblogs.com/luchen927/archive/2012/02/29/2368070.html快速排序采用的思想是分治思想。

举例说明一下吧,假设要排序的序列为

2 2 4 9 3 6 7 1 5 首先用2当作基准,使用i j两个指针分别从两边进行扫描,把比2小的元素和比2大的元素分开。首先比较2和5,5比2大,j左移

2 2 4 9 3 6 7 1 5 比较2和1,1小于2,所以把1放在2的位置

2 1 4 9 3 6 7 1 5 比较2和4,4大于2,因此将4移动到后面

2 1 4 9 3 6 7 4 5 比较2和7,2和6,2和3,2和9,全部大于2,满足条件,因此不变

经过第一轮的快速排序,元素变为下面的样子

[1] 2 [4 9 3 6 7 5]

之后,在把2左边的元素进行快排,由于只有一个元素,因此快排结束。右边进行快排,递归进行,最终生成最后的结果。

int quicksort(vector<int> &v, int left, int right){        if(left < right){                int key = v[left];                int low = left;                int high = right;                while(low < high){                        while(low < high && v[high] > key){                                high--;                        }                        v[low] = v[high];                        while(low < high && v[low] < key){                                low++;                        }                        v[high] = v[low];                }                v[low] = key;                quicksort(v,left,low-1);                quicksort(v,low+1,right);        }}

快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。

最坏情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个。时间复杂度为O(n*n)

在最好情况下,每次划分所取的基准都是当前无序区的"中值"记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数:O(nlgn)

尽管快速排序的最坏时间为O(n2),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。它的平均时间复杂度为O(nlgn)。

时间: 2024-12-10 15:37:43

快速排序 代码的相关文章

快速排序代码(选择最右值最为枢纽元)

        参考了<数据结构域算法分析>书上部分代码,结合自己的理解写出的快速排序程序.书上用三数中值分割法来选择枢纽元,有它的好处,但我觉得使得代码很多地方不够直观.我选择数组的最后一个元素作为枢纽元,然后实现了快排. 关于快排的原理可以去看我博客转载的文章,很直观:点击打开链接 快排的步骤就是: 1.选择枢纽元   2.将小于枢纽元的数放前面,大于枢纽元的数放后面,枢纽元放中间                  3.然后对枢纽元左右两个部分继续进行1和2   下面程序中最主要的是Qui

java冒泡排序和快速排序代码

冒泡排序: 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换.public class BubbleSorted{ public BubbleSorted(){ int a[]={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

快速排序代码备份

快速排序算法: // QuickSort.cpp : 定义控制台应用程序的入口点. // #include<iostream> using namespace std; template <typename T> void QSort(T* a, int n) { if (n <= 1) //记住是小于等于1 { return; } if (n == 2) { if (a[0] > a[1]) swap(a[0], a[1]); return; //记得有return

快速排序代码

#include<stdio.h> #include<stdlib.h> #include<time.h> int RandomPartition(int *A,int beg,int end) { if(A == NULL || beg>end) { exit(0); } int i=beg; int j=end; int k=beg+rand()%(end-beg+1); int temp=A[beg]; A[beg]=A[k]; A[k]=temp; int

对快速排序的理解以及相关c++代码

快速排序:在一组数据中,可以将左边的数字当作枢轴(右边也可以),接下来要做的就是,先从右边找到比枢轴小的数, 再从左边找到比枢轴大的数,接着将这两个数进行交换,重复上述步骤找出所有符合条件的数进行交换, 最后将枢轴放到比枢轴大的数与比枢轴小的数之间.之所以要从右边开始找,并且找到比枢轴小的数是因为交换后小的数就在枢轴的左边了. 下面举个比较特殊的例子希望能增加理解. 1 9 8 5 6 7 3 2 0 4 先从右往左找到比1小的第一个数字为0,此时的索引位置j=8,再从左往右找到比1大的第一个数

白话排序算法--快速排序

前言: 写到快速排序时,之前已经进行了冒泡.选择.插入排序,发现算法问题很多东西都是和实际问题相逆的,实际你可能会由外及里,由上及下,可是算法里面它有时就需要你由里往外去扩散,好比最里面的是小成果,然后一次次往外变化,成果也慢慢变大,最后直至达到最终成果为止.本篇快速排序方法因为调用了递归,你就可以逆着由里及外来思考问题. 写这篇文章光画图就花费了我2小时时间,越抽象就越不好形容和比喻,画的不好,希望各位不要吐槽. 快速排序:先快速排序将队列一分为二,然后对每个队列进行递归调用快速排序方法,直至

快速排序总结

数据结构之排序算法——快速排序 代码很多地方借鉴了  http://my.csdn.net/MoreWindows 他的思想, 本人认为该作者已经写的很好了,只是在他的基础上加入了一些自己的理解和说明 如果涉及到版权的问题,请联系我的邮箱,我会尽快删除 希尔排序想关链接: 维基百科:https://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F#C.E8.AA.9E.E8.A8.80 百度百科:http://baike.bai

划分算法与快速排序

原文链接:http://www.orlion.ga/201/ 一.划分算法 1.划分 划分是快速排序的根本机制.划分数据就是把数据分成两组,所有大于特定值的数据在一组,所有小于特定值的在一组.比如将{3,1,9,0,4,7,2,6,5,8}以特定值为5划分为{3,1,0,4,5}和{9,0,7,6,8} 2.划分算法 划分算法由两个指针来完成,这两个指针分别指向数组的两头,左指针leftPtr向右移动而右指针rightPtr向左移动,实际上leftPtr和rightPtr初始化时是在左右边的各减

啊哈!算法之快速排序与桶排序

啊哈!算法之快速排序与桶排序 1.快速排序算法 快速排序由 C. A. R. Hoare(东尼·霍尔,Charles Antony Richard Hoare)在1960 年提出,之后又有许多人做了进一步的优化.在数列种随机找出一个基准数,因为数列是杂乱的,所以取首项为基准数.从后往前找到比基准数大的位置,再从前往后找到比基准数小的位置,交换元素:右游标向前移动与左游标向后移动,它们相遇时用基准数的位置与相遇的位置交换.此时原来数列以相遇的位置被划分为了两个需要排序的数列,再次执行上述过程:当左