快速排序的优化

来源:互联网 发布:雷姆雷姆软件汉化 编辑:程序博客网 时间:2024/05/23 11:46

本文源于算法导论第二版习题 7.4-5.。一般称改进的快速排序,又称快速插入排序。

题目的大体意思是:当待排数组近似有序时,插入排序的效率会很高,那么考虑在快速排序的时候,当子问题的规模足够小时,子问题不排序,这样到最后,原待排数组将近似有序,此时采用插入排序来完整最终的排序。而我的实现则是:当子问题的规模大于某个临界值k时,采用传统的快速排序法,当子问题的规模小于k时,改用插入排序。我猜想这样的是实现应该更具效率:


下面附上完整的可实现代码(C语言版):

//by Haiyuan//2012/11/2//改进的快速排序的实现//快排与插排的合成物#include "windows.h"#include <time.h>#include <stdio.h>#include <stdlib.h>#define BUFFER_SIZE 25000 //指定待排数据的规模int k=8;//k默认取6void swap(int &a,int &b);int Partition(int *a,int p,int r);void InsertSort(int *a,int p,int r);void ImprovedQuickSort(int *a,int p,int r,int k);int main(){DWORD dwStart,dwEnd,dwCost;int i=0;int j=0;int a[BUFFER_SIZE];//随机数组生成 srand((unsigned)time(NULL));for(j=0;j<BUFFER_SIZE;j++){a[j]=rand()%10000;} //当要验证算法正确性时,可还原下段代码,以便观察//当要考察算法的效率时,可注释下段,只观察其运行时间//by Haiyuan    printf("随机数组如下:\n");for(i=0;i<BUFFER_SIZE;i++){printf("%d ",a[i]);} printf("\n");dwStart=GetTickCount();//算法开始时间ImprovedQuickSort(a,0,BUFFER_SIZE-1,k);dwEnd=GetTickCount();//算法结束时间dwCost=dwEnd-dwStart;//ImprovedQuickSort()执行时间,用以评估算法的效率//当要验证算法正确性时,可还原下段代码,以便观察//当要考察算法的效率时,可注释下段,只观察其运行时间//by Haiyuan    printf("\n优化后的快排结果如下:\n"); for(i=0;i<BUFFER_SIZE;i++)//输出排序后的结果,可设置BUFFER_SIZE为某一较小数值来验证算法的正确性{printf("%d ",a[i]);}printf("\n\nImprovedQuickSort运行的时间为: %u ms\n",dwCost);return 0;} void swap(int &a,int &b)//swap函数,交换两个整数{int temp;temp=a;a=b;b=temp;}int Partition(int *a,int p,int r)//快排的核心{int pivot=a[r];int i=p-1;for(int j=p;j<r;j++) //确保小于pivot的值全部安排到数组的低端{if (a[j]<=pivot)swap(a[++i],a[j]);}swap(a[++i],a[r]);//确保pivot的临界属性:左边的都小于等于pivot,右边的都大于pivotreturn i;}void InsertSort(int *a,int p,int r)//插排的实现,可改进{int temp[BUFFER_SIZE];//此处temp数组的大小,r-p+1即足够,但是不知道在C语言中如何实现变长数组int i=0;int j=0;temp[0]=a[p];for(j=p+1;j<=r;j++){i=j-p-1;while(a[j]<=temp[i]){temp[i+1]=temp[i];i--;}temp[i+1]=a[j];}for(j=p,i=0;j<=r;j++){a[j]=temp[i];i++;}}void ImprovedQuickSort(int *a,int p,int r,int k){if(r-p+1<k){InsertSort(a,p,r);}else if(r-p+1>=k){int pivot=Partition(a,p,r);ImprovedQuickSort(a,p,pivot-1,k);ImprovedQuickSort(a,pivot+1,r,k);}}
	
				
		
原创粉丝点击