C++快速排序讲解+算法
首先说说快速排序,现在网上很多快速排序的解释,我也谈谈我自己对快速排序的了解和看法。
快速排序是一种很高效的排序算法,它的核心思想是:在要排序的数组中,先选定一个数(一般是第一个数或者最后一个数,就叫它x),以x为标准,进行一次排序,排序的结果是以x为中间值,比它大或小的值都在它的两边,然后再对两边部分继续排序,直到排好。
举例说明:
以数组:s[12,2,4,56,64,8,12,32,79,9]为例进行升序排序。
选定第一个数12为初值,x=12;设定两个数组下标变量:组首i=0,组尾j=9;
从右往左找比x小或等于的数:即j=9,然后将9赋值给s[0],即s[0]=9;此时s[9]还是为9;
接下来从左往右开始找比x大的数:即从i=1处开始找,直到i=3时,将56赋值给刚刚的s[9],即s[9]=s[3];s[9]的值就为56;
再从j=8处从右往左找比x小或等于的数:找到s[6],执行s[3]=s[6],
再从i=3处从左往右开始找比x大的数:找到s[3],执行s[6]=s[3];
再从j=5处从右往左找比x小或等于的数:找到s[5],执行s[3]=s[5];
再从i=4处从左往右开始找比x大的数:找到s[4],执行s[5]=s[4];
这时x就处于整个数组中间,把s[5]=x,第一趟排序就完成了。
画个图看看每趟排序后的结果:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
12 | 2 | 4 | 56 | 64 | 8 | 12 | 32 | 79 | 9 | |
1 | 9 | 2 | 4 | 56 | 64 | 8 | 12 | 32 | 79 | 9 |
2 | 9 | 2 | 4 | 56 | 64 | 8 | 12 | 32 | 79 | 56 |
3 | 9 | 2 | 4 | 12 | 64 | 8 | 12 | 32 | 79 | 56 |
4 | 9 | 2 | 4 | 12 | 64 | 8 | 64 | 32 | 79 | 56 |
5 | 9 | 2 | 4 | 12 | 8 | 8 | 64 | 32 | 79 | 56 |
6 | 9 | 2 | 4 | 12 | 8 | 12 | 64 | 32 | 79 | 56 |
# include <iostream>
using namespace std;
void quickSortDown(int a[], int, int);//函数声明,按降序排序
void quickSortUp(int a[], int, int);//函数声明,按升序序排序
int main()
{
int array[] = {12,2,4,56,64,8,12,32,79,9,19};//34, 65, 12, 43, 67, 5, 78, 10, 3, 70
int k;
int len = sizeof(array) / sizeof(int);
cout << "The orginal array are:" << endl;
for (k = 0; k < len; k++)
cout << array[k] << ",";
cout << endl;
quickSortDown(array, 0, len - 1);
cout << "The sorted array are" << endl;
for (k = 0; k < len; k++)
cout << array[k] << ",";
cout << endl;
quickSortUp(array, 0, len - 1);
cout << "The sorted array are" << endl;
for (k = 0; k < len; k++)
cout << array[k] << ",";
cout << endl;
system("pause");
return 0;
}
void quickSortDown(int s[], int l, int r)//降序算法
{
if (l < r)
{
int i = l, j = r, x = s[l];
while (i < j)
{
while (i < j&&s[j] < x) //从右向左找第一个大于等于x的数
j--;
if (i<j)
{
s[i++] = s[j];
}
while (i < j&&s[i] >= x)//从左向右找第一个小于x的数
i++;
if (i < j)
{
s[j--] = s[i];
}
}
s[i] = x;
quickSortDown(s, l, i - 1);
quickSortDown(s, i + 1, r);
}
}
void quickSortUp(int s[], int l, int r)//升序算法
{
if (l < r)//判断数组头尾正确,递归调用时判断条件
{
int i = l, j = r, x = s[l];
while (i < j)
{
while (i < j&&s[j] > x)//从右向左找到第一个小于等于x的数
j--; //没找到就让j指针前移一位
if (i < j) //找到了判断i和j是不是在同一位置
{
s[i++] = s[j]; //将找到的数赋值给s[i],再让i指针后移一位
}
while (i < j&&s[i] <= x)//从左向右找到第一个大于等于x的数
i++;
if (i < j)
{
s[j--] = s[i];
}
}
s[i] = x;
quickSortUp(s, l, i - 1); //递归调用本身
quickSortUp(s, i + 1, r); //递归调用本身
}
}
刚学习,粗陋见解,不对的地方欢迎指出。
我参考了这篇文章的代码,感兴趣的可以去看看http://blog.sina.com.cn/s/blog_5c5bc9070100y4zv.html