看算导时顺便把快排的几种划分方法实现了一下,其实我是当做笔记的
/************************************************************************/
/*kuaisupaixu.c
//快速排序的一个实现 */
/************************************************************************/
#include<stdio.h>
#include<stdlib.h>
//普通划分
int partition(int arr[],const int start,const int end){
// start end 为开始结束下标
int tar = arr[end];//排列标杆
int temp = 0;//用与交换
int i = 0;
int j = start - 1;
// !! 循环要从start开始到end结束,不是从i开始
for(i = start;i<end;i++){
if(arr[i] < tar){
temp = arr[i];
arr[i] = arr[j+1];
arr[j+1] = temp;
++j;
}
}
temp = arr[end];
arr[end] = arr[j+1];
arr[j+1] = temp;
return j+1;
}
//随机划分
int randomPartition(int arr[],int start,int end){
int r = start + rand()%(end-start);
int temp = 0;//用于交换
temp = arr[r];
arr[r] = arr[end];
arr[end] = temp;
return partition(arr,start,end);
}
//Hoare划分
int hoarePartition(int arr[],int start,int end){
int x = arr[start];
int i = start-1;
int j = end+1;
int temp = 0;//用于交换
while(1){
while(1){
--j;
if(j<=start){
j = start;
break;
}
if(arr[j]<=x){
break;
}
}
while(1){
++i;
if(i>=end){
i = end;
break;
}
if(arr[i]>=x){
break;
}
}
if(i<j){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
else
break;
}
return j;
}
void quickSort(int arr[],const int start,const int end){
//start end 为开始结束下标
int middle = 0;
if(start < end){
//middle = partition(arr,start,end);
//middle = hoarePartition(arr,start,end);
middle = randomPartition(arr,start,end);
quickSort(arr,start,middle-1);
quickSort(arr,middle+1,end);
}
}
int main(){
int i = 0;
int i_arr[] = {2,3,4,1,8,7,6,5,9,0,99,88,77,66,1552,44,33,22,11,12,344,55,23,65,76,112,54};
quickSort(i_arr,0,26);
for(i = 0;i<27;i++){
printf("%d ",i_arr[i]);
}
return 0;
}
快排的话主要还是个合理的划分,好的划分函数能很好的减少耗时期望值,待续。。。