您的位置:首页 > 其它

算法——快速排序

2017-09-17 11:21 274 查看
基本思想:

通过一趟快速排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

每一趟排序中,都确定一个基准数,把比它小的都放左边,比它大的放右边,这个过程的算法可以结合其他算法,本文中举出了以下两个例子。

快速排序的时间复杂度一般为: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: