C++之快排
#include <iostream>
using namespace std;
//函数名称:partition
//函数功能:实现对序列a[x] = a[y]进行划分
//函数参数说明:a[]:要排序的序列 , x和y分别该序列的最小下标和最大下标
//函数返回值:int
//主要功能 : 划分
/**
* 思路 :
* 左序列 , 主元 , 右序列
* 一般选择第一个元素为主元
* i 右移 , j 左移
* 当i遇到大元素时,stop 即 :当i < j 且 a[i] <= a[p]时 ; i++
* 当j遇到小元素时,stop 即 :当i < j 且 a[j] >= a[p]时 ; j--
*/
int partition(int * a,int left,int right)
{
int i = left,j = right + 1;
do{
do i++; while (a[i] < a[left]);
do j--; while (a[j] > a[left]);
//交换元素,小~大
if(i < j)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}while (i < j); //直到比较完一趟
//交换a[p] 与 a[j] ,及主元 与 a[j],现在的主元应该是第一个元素a[left]
int t = a[left];
a[left] = a[j];
a[j] = t;
//返回 j 的位置,分开了~
return j;
}
//函数名称:quickSort
//函数功能:对序列a[x]~a[y]快速排序
//函数参数说明:a[]:要排序的序列 , x 和 y 分别为该序列最小下标和最大下标
//函数返回值:void
//主要功能 : 递归排序
void quickSort(int * a,int x,int y) //快速排序,区间为[x,y]
{
if(x < y)
{
//划分成左右两个部分(尽量等长),m返回的是划分基准元素所在的位置
int m = partition(a , x , y);
//递归左右两边的排序
quickSort(a,x,m - 1);
quickSort(a,m + 1,y);
}
}
int main()
{
int n,i;
int a[100];
cout<<"请输入数组的规模n : ";
cin>>n;
cout<<"\n请输入按要排序的"<< n <<"个元素 : ";
for(i = 0;i < n;i++)
scanf("%d",&a[i]);
cout<<"\n输出排序前的"<< n <<"个元素 : ";
for(i = 0;i < n;i++)
printf("%d ",a[i]);
cout<<endl;
quickSort(a,0,n - 1);
cout<<"\n输出排序后的"<< n <<"个元素 : ";
for(i = 0;i < n;i++)
printf("%d ",a[i]);
return 0;
}
结果 :