在本改进算法中,只对长度大于k的子序列递归调用快速排序,让原序列基本有序,然后再对整个基本有序序列用插入排序算法排序。实践证明,改进后的算法时间复杂度有所降低,且当k取值为 8 左右时,改进算法的性能最佳。算法思想如下:
参考:http://blog.csdn.net/hguisu/article/details/7776068
#include <stdio.h>
#include <stdlib.h>
void InsertSort(int arr[],int len);
void quickSort(int arr[],int len);
void quickSort_imp(int arr[],int start,int end);
int patition(int arr[],int start,int end);
void printArr(int arr[],int len);
void swap(int *a,int *b);
int main()
{
int arr[]={2,5,1,3,7,8};
int len = sizeof(arr)/sizeof(int);
printArr(arr,len);
InsertSort(arr,len);
printArr(arr,len);
return 0;
}
void quickSort(int arr[],int len){
quickSort_imp(arr,0,len-1);
InsertSort(arr,len);
}
int patition(int arr[],int start,int end){
int privotKey = arr[start];
while(start<end){
while(start<end&&arr[end]>=privotKey){
end--;
}
if(start<end){
swap(&arr[start],&arr[end]);
}
while(start<end&&arr[start]<=privotKey){
start++;
}
if(start<end){
swap(&arr[start],&arr[end]);
}
}
arr[start]= privotKey;
}
void quickSort_imp(int arr[],int start,int end){
if(end-start>8){
int pivot = patition(arr,start,end);
quickSort_imp(arr,start,pivot-1);
quickSort_imp(arr,pivot+1,end);
}
}
void printArr(int arr[],int len){
for(int i=0;i<len;i++)
printf("%d ",arr[i]);
printf("\n");
}
void swap(int *a,int *b){
int t = *a;
*b=*a;
*a = t;
}
void InsertSort(int arr[],int len){
for(int i=1;i<len;i++){
int tmp = arr[i];
int index =i;
while(index-1>=0&&tmp<arr[index-1]){
arr[index]=arr[index-1];
index--;
}
arr[index]=tmp;
}
}