快速排序优化版

来源:互联网 发布:淘宝领卷公众号 编辑:程序博客网 时间:2024/05/16 14:54

在本改进算法中,只对长度大于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;    }}
原创粉丝点击