快速排序(思路 与 c++实现例子)
我的思路(由小到大排列):
- 假设有一数组 arr = {……}(元素个数大于2)。
- 取任意一个元素为基准数temp,这里取数组的首元素。
- 把小于或等于temp的元素放在temp的左边,把大于或等于temp的元素放右边,就可以得到如下表排列的数组arr:
小于或temp的元素 | 基准数 | 大于或等于temp的元素 |
---|---|---|
集合n1 | temp | 集合n2 |
可以知道集合n1与n2是无序的,n1的元素都比n2的元素小,我们已经确定了temp的位置。(这一步骤在下面的代码中实现,不唯一的。)
- 对n1和n2进行递归。无序的集合就会变多,但无序集合的元素会减少,直至为1个元素。当每个集合的元素为1,数组arr排列完毕!
代码:
#include<iostream>
using namespace std;
void mysort( int *arr, int left, int right )//left为数组的最左元素,right为数组最右元素。
{
if( left >= right )return;// 数组长度为1直接结束。
bool flag = true;//先从右边开始扫描数组arr。
int temp = arr[left];//先保存基准数。
int i = left, j = right;
while( i != j )
{
if( flag )//flag==true,从当前的j开始向左扫描数组arr.
{
while( arr[j] >= temp && j > i )j--;//j向左移,找到小于temp的值。
arr[i] = arr[j];//a[j]覆盖a[i],此时a[i]<temp。
flag = false;//下一次转变为:循环从i向右边开始扫描 。
}
else//flag==false,从当前的i向右扫描。
{
while( arr[i] <= temp && j > i )i++; //i向右移,找到大于temp的值。
arr[j] = arr[i];//a[i]覆盖a[j],此时a[j]>temp。
flag = true;//下一次转变为:循环从j向坐边开始扫描 。
}
}
/*i==j,循环结束。此时i(或者说j)左边的数都小于或等于temp,右边的数都大于temp*/
arr[i] = temp;//i就是temp的下标。
//分别对i左边的数和右边的数进行递归。
mysort( arr, left, i-1 );
mysort( arr, i+1, right );
}
int main()
{
int n;
int i;
//输入数据。
cin >> n;
int* arr = new int[n];
for( i = 0; i < n; i++ )
{
cin >> arr[i];
}
mysort( arr, 0, n-1 );//进行排列。
//输出结果。
for( i = 0; i < n; i++ )
{
cout << arr[i] << " ";
}
return 0;
}