经典算法之教你如何理解快速排序算法讲解与图示
经典的快速排序算法讲解,网上流行着很多篇文章,有些文章读起来不是那么容易理解,还有些文章不知道是不是快速排序来的,验证起来真的得不到正确的结果,所以我也来写一篇文章,介绍一下自己的理解,毕竟是读书时学习的经典,而且也是面试时常常被拿来当做考题,所以,在这里就算是给需要用到快速排序算法思想的程序员分享一下自己的理解。
首先,我们需要一组等待排序的数组,如下:
A[0],A[1],A[2],A[3],A[4],A[5],A[6],A[7],A[8],A[9]
{8,6,2,5,7,4,7,9,3}
快速排序的思想如上面示意图,注意未输入的实际数据,所以上面只是说明一个思想:
(1),需要一个参考点,Key
(2)把Key跟最后一个调换,这里即Key<->A[9]
(3)开始从A[0]逐一对比,A[n]<Key? 比key小的A[n]将会调换最前面那个比Key大的A[i]同时++i,否则什么也不做n++
(4)上面3步走完后,将得出第1轮的排序结果,你这时会发现,前面一部分都是比Key小的,后面一部分都是比Key大的,这样就分成了2部分了,接着分开来递归排序前面一部分与后面一部分。
(5)是最后一步的排序结果了,还可以分2部分?是则走第一步,否则弹出递归上一级。
演示代码如下:
#include <iostream>
using namespace std;
class QuickSort
{
public:
void set_n(int n);
int get_n();
int part_sort(int part_start, int part_end);
void quick_sort(int start, int end);
void exchange(int &start, int &end);
void print();
/*构造函数初始化*/
QuickSort(int a):n(a){
A[0] = 8;
A[1] = 6;
A[2] = 2;
A[3] = 5;
A[4] = 7;
A[5] = 4;
A[6] = 7;
A[7] = 9;
A[8] = 3;
}
private:
int n;
int A[100];
};
void QuickSort::set_n(int n)
{
this->n = n;
}
int QuickSort::get_n()
{
return this->n;
}
/*
* 不同的部分里面排序
*/
int QuickSort::part_sort(int part_start, int part_end)
{
int rand_no = 0;
int key = 0;
int i = 0;
int j = 0;
rand_no = rand()%(part_end - part_start + 1) + part_start; //随机在每部分里面获取一个Key点
exchange(A[rand_no], A[part_end]);
key = part_end;
i = part_start-1;
for(j = i + 1; j < part_end; j++)
if(A[j] < A[key])
exchange(A[j], A[++i]);
exchange(A[++i], A[key]);
print();
return i;
}
/*
* 打印排序结果
*/
void QuickSort::print()
{
cout << "#############################" << endl;
for(int j = 0; j < n; j++)
{
cout << " A[" << j << "]:" << A[j] ;
}
cout <<endl;
cout<< "#############################" << endl;
}
/*
*2个数调换位置
*/
void QuickSort::exchange(int &start, int &end)
{
int temp = start;
start = end;
end = temp;
}
/*
* 开始快速排序
*/
void QuickSort::quick_sort(int start, int end)
{
int ret = 0;
if(start < end){
ret = part_sort(start, end);
quick_sort(start, ret - 1);
quick_sort(ret + 1, end);
}
}
void main ()
{
QuickSort *qCls = new QuickSort(9);
qCls->quick_sort(0,9-1);
}
运行结果: