/*快速排序复杂度O(N*LogN),可以理解为挖坑填数 + 分治法。
基本思想:
1、先从数列中取出一个数作为基准数,
2、划分区间过程,将比这个数大的数全放在它的右边,小于或等于它的数全放在它的左边
3、再对左右区间重复第二步,直到各区间只有一个数。
对挖坑填数进行总结:
1、i = L,j = R;将基准数挖出形成第一个坑a[i];
2、j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i];
3、i++由前向后找比它大的数,找到后挖出此数填前一个坑a[j];
4、再重复执行2、3两步,直到i==j,将基准数填入a[i]中*/
#include <iostream>
using namespace std;
//返回基准数下标
int arraySort(int a[], int l, int r)
{
//初始化变量
int i = l;
int j = r;
int x = a[l];
//循环检测
while(i < j)
{
//从后向前找比x小的数
while(i < j && a[j] >= x)
{
--j;
}
//判别确定是否在i后面存在比x小的a[j]
if(i < j)
{
a[i] = a[j];
++i;
}
//从前向后找比x大的数
while(i < j && a[i] < x)
{
++i;
}
if(i < j)
{
a[j] = a[i];
--j;
}
}
a[i] = x;
return i;
}
//快速排序
void quick_sort(int a[], int l, int r)
{
if(l < r)
{
int i = arraySort(a, l, r);
//递归调用
quick_sort(a, l, i - 1);
quick_sort(a, i + 1, r);
}
}
/*
//综合版本
void quick_sort(int a[], int l, int r)
{
//初始化
int i = l;
int j = r;
int x = a[l];
if(l < r)
{
while(i < j)
{
while(i < j && a[j] >= x)
--j;
if(i < j)
a[i++] = a[j];
while(i < j && a[i] < x)
++i;
if(i < j)
a[j--] = a[i];
}
a[i] = x;
quick_sort(a, l, i - 1);
quick_sort(a, i + 1, r);
}
}*/
void Test(char TestName[], int a[], int l, int r)
{
if(TestName != NULL)
cout << TestName << ":" << endl;
quick_sort(a, l, r);
for(int i = 0; i <= r; ++i)
cout << a[i] << " ";
}
void Test1()
{
int a[] = {7 ,13, 6 ,12, 9, 0};
Test("Test1", a, 0, sizeof(a) / sizeof(int) - 1);
}
int main()
{
Test1();
return 0;
}
快速排序实现
最新推荐文章于 2021-07-18 15:37:19 发布