快速排序优化版

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


}

猜你喜欢

转载自blog.csdn.net/qianyedoufulao/article/details/78283124
今日推荐