基本思想:
通过一趟快速排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
每一趟排序中,都确定一个基准数,把比它小的都放左边,比它大的放右边,这个过程的算法可以结合其他算法,本文中举出了以下两个例子。
快速排序的时间复杂度一般为:O(nlogn),最坏的情况是O(n^2),但这种情况很少见。
例子:
给定一个整形数组,长度不确定,元素不确定,使用快速排序将其从小到大排序。
C语言代码一:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void sort(int *array,int start,int end){
int i=start,j=end,key=start;
int e=0;
while(i!=j){
for(;j!=i;j--){
if(array[j]<array[key]){
e=array[key];
array[key]=array[j];
array[j]=e;
key=j;
break;
}
}
for(;i!=j;i++){
if(array[i]>array[key]){
e=array[key];
array[key]=array[i];
array[i]=e;
key=i;
break;
}
}
}
if(i-1>start)
sort(array,0,i-1);
if(i+1<end)
sort(array,i+1,end);
}//快速排序
int main(){
int *arr,n,i;
//数组初始化
printf("请输入数组长度:");
scanf("%d",&n);
arr=(int*)malloc(n*sizeof(int));
printf("请输入数组:");
for(i=0;i<n;i++){
scanf("%d",&arr[i]);
}
printf("\n\n");
//遍历排序前数组
for(i=0;i<n;i++)
printf("%3d",arr[i]);
printf("\n");
//排序
sort(arr,0,n-1);
//遍历排序后数组
printf("\n\n");
for(i=0;i<n;i++)
printf("%3d",arr[i]);
printf("\n");
free(arr);
return 0;
}
C语言代码二(算法导论版):
详情参见:《算法导论》
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void sort(int *array,int start,int end){
int i=start,j=start,key=array[end];
int e=0;
for(;j<end;j++){
if(array[j]<key){
e=array[i];
array[i]=array[j];
array[j]=e;
i++;
}
}
array[end]=array[i];
array[i]=key;
if(i-1>start)
sort(array,start,i-1);
if(i+1<end)
sort(array,i+1,end);
}//快速排序
int main(){
int *arr,n,i;
//数组初始化
printf("请输入数组长度:");
scanf("%d",&n);
arr=(int*)malloc(n*sizeof(int));
printf("请输入数组:");
for(i=0;i<n;i++){
scanf("%d",&arr[i]);
}
printf("\n\n");
//遍历排序前数组
for(i=0;i<n;i++)
printf("%3d",arr[i]);
printf("\n");
//排序
sort(arr,0,n-1);
//遍历排序后数组
printf("\n\n");
for(i=0;i<n;i++)
printf("%3d",arr[i]);
printf("\n");
free(arr);
return 0;
}