快排算法
快排和冒泡都是基于交换的思想,但是进行了改进,更为高效。
流程:
(1)首先设定一个分界值,通过分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。
(3)左右两个部分重复上述排序。
从上述流程可以看出,这就是一个递归的过程,递归终止即只有一个元素
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
void QuickSort(int *a,int left,int right)
{
int rt,lt,t,base;
rt=right; //rt为分界值分界后的左半部分的右边界
lt=left; //lt为分界值分界后的右半部分的左边界
base=a[left];
/*这里定义分界值,这个分界值定在哪里都是可以的,定在中间更为直观,若定在其他地方,手动排一下就知道,边界值会换到中间去,和定在中间一个样*/
while (lt < rt)
{
while(a[lt] < base) lt++; //从左边开始寻找大于分界值的值
while(a[rt] > base) rt--; //从右边开始寻找小于分界值的值
if(lt < rt) /*lt小于rt,就交换这两个的值,lt与rt必不会在边界值同一侧,手动按照算法排一下就知道,lt或rt到了边界值的时候就会停下来,交换的时候就会把边界值换到中间去了*/
{
t = a[lt] ;
a[lt] = a[rt] ;
a[rt] = t ;
lt++;
rt--;
}
}
if(lt == rt) lt++; //此处为了避免两个边界模糊不清
if( left < rt ) QuickSort(a,left,rt); //递归对左半部分排序
if( right > lt) QuickSort(a,lt,right); //递归对右半部分排序
}
int main()
{
srand(time(NULL));
int n;
cout<<"Please cin the size of array:"<<endl;//输入数组的大小
cin>>n;
int a[n];
cout<<"Array before sorting is:"<<endl;
for (int i = 0; i < n; i++) //利用随机数输入数组
{
a[i]=rand()/1000;
cout<<a[i]<<" ";
}
cout<<endl;
QuickSort(a,0,n-1);
cout<<"Array after sorting is:"<<endl; //输出排序结果
for (int i = 0; i < n; i++) cout<<a[i]<<" ";
cout<<endl;
return 0;
}