快速排序是对冒泡排序法的改进,分而治之,大规模递归的算法。快速排序比大部分排序算法都要快。尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。
其基本思想是:从数组挑选一个关键数(任意一个数都可以),将其他大于这个数的的数放到它的右边(对于从小到大排序),小的放到左边。这样数组被分成左右两个子数组。然后分别对子数组执行上述操作。一直重复,直到不能再分。
快速排序步骤为:
1)排序开始的时候:i=0(数组起始位置),j=N-1(数组结束位置);
2)以第一个数组元素作为关键数据,key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j -- ),找到第一个小于key的值A[j],A[i]与A[j]交换;
4)从i开始向后搜索,即由前开始向后搜索(i ++ ),找到第一个大于key的A[i],A[i]与A[j]交换;
5)重复第3、4、5步,直到 i=j;
6)对子数组重复上述步骤(递归)。
代码:
#include<iostream>
using namespace std;
int Partition(int data[],int i,int j)
{
int key = data[i];
while (i<j)
{
while (i<j&&data[j]>=key) j--;
if (i<j)
{
data[i]=data[j];
data[j]=key;
}
while (i<j&&data[i]<key) i++;
if (i<j)
{
data[j]=data[i];
data[i]=key;
}
}
return i;
}
void QuickSort(int data[],int i,int j)
{
if (i<j)
{
int k = Partition(data,i,j);
QuickSort(data,i,k-1);
QuickSort(data,k+1,j);
}
}
int main()
{
int num[]={2,1,34,6,8,5,3,6,8,0,5,5,35,3,567,74,98};
for(int i=0;i<17;i++)
cout<<num[i]<<' ';
QuickSort(num,0,16);
cout<<endl;
for(int i=0;i<17;i++)
cout<<num[i]<<' ';
return 0;
}