快速排序思想:每次找到一个标杆,在序列中的前面部分放置比标杆小的元素,在序列后面部分放置比标杆大的元素,那么标杆放置的位置则可以确认。待主循环结束,则是排序好的序列。
确认标杆位置:
在排序过程中,需要两个前后索引index[left],index[right]。index[left]向后前进,而index[right]往前回退。这两个索引需要找到不符合要求的元素(前面的元素比标杆大,后面的元素比标杆小),将两者交换,待循环结束后,则可以放置标杆位置。
找到新的标杆:
选取index[left]和index[right]需要注意,index[left]>index[标杆] , index[right]>index[标杆]。所以index[right]的位置则是当前标杆的位置,swap(index[right],index[标杆])。
当循环结束后,则是排序好的序列。
例如: 5 4 6 3 1(设p1为index[left],p2为index[right])
5为标杆:
p1>index[5],p2>index[5]
出现了不符合要求的,则swap()。
因为p2<p1则不需要swap(),那么p2则是标杆的位置,所以:swap(5,p2)
当前序列为:
3 4 1 5 6
3为新的标杆:
p2>p1,则swap(p1,p2),然后继续循环
p2<p1,不用swap(),p2的位置是标杆位置,则swap(3,p2)
至此序列为:
1 3 4 5 6
参考代码:
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
const int c_n=10;
//取一个标杆,序列前放比标杆小的,后面放比标杆大的
//遍历序列,找到不符合要求的数据,并交换
//遍历结束,则可以放置标杆,继续寻找新的标杆
//时间复杂度log(n)
void swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
void quicksort(int *a,int left,int right)
{
int i = left+1;
int j = right-1;
if (i <= j)
{
while (i < j)
{
while (a[left]>a[i] && i < right) //找到左边比left大的数
i++;
while (a[left] <= a[j] && j > left) //找到右边比left小的数
j--;
if ( i < j) //交换
{
swap(&a[i], &a[j]);
}
}
if (a[left]>a[j]) //需要判断当前位置是否是基准值应该放的位置
swap(&a[j], &a[left]); //交换,新的基准值
quicksort(a, left, j);
quicksort(a, j + 1, right);
}
return;
}
void main()
{
int a[c_n] = { 0 };
srand(time(NULL));
for (int i = 0; i < c_n; i++)
{
a[i] = rand() % 200;
}
quicksort(a, 0, c_n);
for (int i = 0; i < c_n; i++)
cout << " " << a[i];
system("pause");
}