简谈快速排序

来源:互联网 发布:金融类软件测试 编辑:程序博客网 时间:2024/06/05 03:33

最近在看算法导论,其实想很快看过去,看到快速排序时,看着他那官方的解释,总感觉耽搁了自己看书的速度,自己理解了后想写一篇能够让其他人能够快速理解快速排序的文章,这就是写这篇博客的原因。

快速排序关键思想:

            取一个数(比如说一个数组最后的一个数),然后调整数组,使这个数组前半部分小于这个数,后半部分大于这个数,然后对前后半部分递归使用快速排序。 

比如最开始是这个样子的数组
8713564

 调整后

21387564可以看出前面三个数小于4,后面四个数大于4

最后可以调整成这个样子

2134756


8
接下来就可以对4的前面部分和后面部分分别进行快速排序了,就可以完成整个排序了。

是不是还是一脸懵逼,猜对了,我们可以发现,快速排序的关键就是找到一种方法完成上述三个步骤,怎么实现的呢?假设如下是个中间状态,前j-1个数中可以明显看出分为俩部分了,j是用来循环遍历的,j此时下面的数字是3,比4小,该怎么做呢?

pi  j  r21783564将3与7交换位置,就可以了对不对?然后i+1,j+1变成下面这个样子:

p i  j r21387564循环时,对所有数字都这样处理就完成了对吧?

代码如下:

#include<iostream>  using namespace std;int PARTITION(int A[], int p, int r);void QUICKSORT(int A[], int p, int r);int main(void){int A[] = { 2, 8, 7, 1, 3, 5, 6, 4 };QUICKSORT(A, 0, 7);for (int i = 0; i < 8; i++){cout << A[i] << " ";}return 0;}void QUICKSORT(int A[], int p, int r)      //分治{if (p<r){int q = PARTITION(A, p, r);QUICKSORT(A, p, q - 1);QUICKSORT(A, q+1, r);}}int PARTITION(int A[], int p, int r)        //关键的<span style="color: rgb(255, 102, 0);">调整数组,使这个数组前半部分小于这个数,后半部分大于这个数</span>{int x = A[r];                             //取最后一个数做比较int i = p - 1;                              //i表示前面的i-1个数比x小了int a;                                  //用于交换for (int j = p; j < r; j++)         //遍历数组{if (A[j]<=x)                 //找到一个数小于等于最后一个数{i++;a = A[i];A[i] = A[j];A[j] = a;             //<span style="color:#ff0000;">就交换A[i+1]与A[j],这个时候下标为0到i+1的数就比最后一个数小了,j继续循环,找下一个比最后一个数小的数</span>}}A[r] = A[i + 1];A[i + 1] = x;      //最后把最后一个数放到中间return i + 1; //返回中间那个数的位置}
这个是最后的结果图





1 0
原创粉丝点击