对c语言系统库函数、堆排序、希尔排序、折半插入排序、快速排序消耗时间的比较

#include <stdio.h>
#include <time.h>

#define N 100000

/*库比较函数:qsort(int *base,int n,int struct_size,int (*compare)(const 

void *,const void *))中的比较函数*/
int compare(const void *first, const void *second)
{
	if (*(int *)first > *(int *)second)/*当第一个数比第二个数大的时候,

就进行排序,排序的结果是从小到大*/
		return 1;
	else
		return -1;
}

/*希尔排序*/
void ShellInsert(int *a, int n, int d)
{
	int i, j, temp;
	for (i = d; i < n; ++i){
		j = i - d;
		temp = a[i];
		while (j >= 0 && temp < a[j]){
			a[j + d] = a[j];
			j -= d;
		}
		a[j + d] = temp;
	}
}

void ShellSort(int *a, int n)
{
	int d = n / 2;
	while (d >= 1){
		ShellInsert(a,n,d);
		d /= 2;
	}
}

/*快速排序*/

void QuickSort(int *a,int low,int high)
{
	int l = low, h = high, temp;
	if (l < h){
		temp = a[low];
		while (l != h){
			while (l<h&&a[h]>temp)
				--h;
			if (l < h){
				a[l] = a[h];
				++l;
			}
			while (l < h&&a[l] < temp)
				++l;
			if (l < h){
				a[h] = a[l];
				--h;
			}
		}
		a[l] = temp;
		QuickSort(a,low,l-1);
		QuickSort(a,h+1,high);
	}
}

/*堆排序*/

void HeapInsert(int *a, int low, int high)
{
	int i = low, j = low * 2, temp = a[i];
	while (j <= high){
		if (j < high && a[j] < a[j + 1])
			++j;
		if (temp < a[j]){
			a[i] = a[j];
			i = j;
			j *= 2;
		}
		else
			break;
	}
	a[i] = temp;
}

void HeapSort(int *a, int n)
{
	int i, temp;
	for (i = n / 2; i >= 0; --i)
		HeapInsert(a,i,n-1);
	for (i = n - 1; i >= 1; --i){
		temp = a[i];
		a[i] = a[0];
		a[0] = temp;
		HeapInsert(a,0,i-1);
	}
}

/*折半排序*/

void BinarySort(int *a,int n)
{
	int i, j, low, middle, high, temp;
	for (i = 1; i < n; ++i){
		low = 0;
		high = i - 1;
		temp = a[i];
		while (low <= high){
			middle = (low + high) / 2;
			if (temp < a[middle])
				high = middle - 1;
			else
				low = middle + 1;
		}
		for (j = i - 1; j > high; --j)
			a[j + 1] = a[j];
		a[low] = temp;
	}
}

void initArray(int *a, int n)
{
	srand(time(NULL));
	int i;
	for (i = 0; i < n; ++i)
		a[i] = rand() % 100;
}

void print(int *a,int n)
{
	int i;
	for (i = 0; i < n; ++i){
		printf("%d ", a[i]);
		if (i && i % 20 == 0)
			printf("\n");
	}
	printf("\n");
}

int main()
{
	int a[N];
	double start, finish;

	//initArray(a, N);
	//printf("排序前:\n");
	//print(a, N);/*排序前*/

	/*计算系统库函数排序消耗的时间*/
	initArray(a, N);
	start = clock();
	qsort(a, N, sizeof(int), compare);
	finish = clock();
	printf("System library sort cost %.3fSeconds\n", (finish - start) / 

1000);
	/*计算折半插入排序消耗的时间*/
	initArray(a, N);
	start = clock();
	BinarySort(a,N);
	finish = clock();
	printf("Binary sort cost %.3fSeconds\n", (finish - start) / 1000);
	/*计算堆排序消耗的时间*/
	initArray(a, N);
	start = clock();
	HeapSort(a, N);
	finish = clock();
	printf("Heap sort cost %.3fSeconds\n", (finish - start) / 1000);
	/*计算希尔排序消耗的时间*/
	initArray(a, N);
	start = clock();
	ShellSort(a, N);
	finish = clock();
	printf("Shell sort cost %.3fSeconds\n", (finish - start) / 1000);
	/*计算快速排序消耗的时间*/
	initArray(a, N);
	start = clock();
	QuickSort(a, 0, N - 1);
	finish = clock();
	printf("Quick sort cost %.3fSeconds\n", (finish - start) / 1000);

	//printf("排序后:\n");
	//print(a, N);
	return 0;
}

对c语言系统库函数、堆排序、希尔排序、折半插入排序、快速排序消耗时间的比较

时间: 2024-11-08 13:47:29

对c语言系统库函数、堆排序、希尔排序、折半插入排序、快速排序消耗时间的比较的相关文章

希尔排序(插入排序)-八大排序三大查找汇总(5)

基本思想 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序. 稳定性 由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的. 时间复杂度 希尔排序的时间复杂度取决于步长的选择. 平均情况下,

希尔排序算法和快速排序算法

希尔排序源代码如下: #include <stdio.h> //希尔排序 void shellSort(int a[],int l, int r){ //一次排序同一步长所组成的集合 如a[0],a[5],a[10]... int i,j,h; for(h=1;h<=(r-1)/9;h=3*h+1); //设置步长为1,4,13,40,121,...序列 for( ; h>0;h/=3) for(i=h;i<=r;i++){ int j = i;int v = a[i]; w

希尔排序(插入排序的改进)C++实现

算法描述: 相对于直接插入排序,希尔排序将数组元素按下标的一定增量分组,对每组进行直接插入排序,随着增量的不断减小,每组包含的元素也就越多,当增量为1时,整个数组被分为一个组,进行直接插入排序之后结束. 下面给出随机整数数组的希尔排序C++实现: #include <iostream> #include <math.h> using namespace std; const int Num=20; void exch(int* s,int a,int b) { int mid=s[

排序算法2--插入排序--折半插入排序

折半插入排序 折半插入排序(binary insertion sort)是对插入排序算法的一种改进,所谓排序算法过程,就是不断的依次将元素插入前面已排好序的序列中. 在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high],则轮比较时将待插入元素与a[m],其中m=(low+high)/2相比较,如果比参考元素小,则选择a[low]到a[m-1]为新的插入区域(即high=m-1),否则选择a[m+1]到a[high]为新的插入区

排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)

总述:排序是指将元素集合按规定的顺序排列.通常有两种排序方法:升序排列和降序排列.例如,如整数集{6,8,9,5}进行升序排列,结果为{5,6,8,9},对其进行降序排列结果为{9,8,6,5}.虽然排序的显著目的是排列数据以显示它,但它往往可以用来解决其他的问题,特别是作为某些成型算法的一部分. 总的来说,排序算法分为两大类:比较排序 和 线性时间排序. 比较排序依赖于比较和交换来将元素移动到正确的位置上.它们的运行时间往往不可能小于O(nlgn). 对于线性时间排序,它的运行时间往往与它处理

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,

浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析(好戏在后面,有图有真相)

由于没考虑到一些情况,对以上一些算法做了改进和对比!以及昨晚把希尔排序写错而误以为其效率高过快速排序的糗事,今天一一做了更正和说明,如果你绝得本随笔不是很妥可以尝试看看这http://www.cnblogs.com/maxiaofang/p/3382927.html,有错误或不妥欢迎指正!!共同学习,共同进步!O(∩_∩)O哈哈~ 推荐一段博友分享的排序视频很艺术.很形象.很生动哦(http://www.oschina.net/question/561584_65522) 最近一段时间去武汉参加

排序算法总结之希尔排序

一,希尔排序算法介绍 ①希尔排序又称缩小增量排序 ,它本质上是一个插入排序算法.为什么呢? 因为,对于插入排序而言,插入排序是将当前待排序的元素与前面所有的元素比较,而希尔排序是将当前元素与前面增量位置上的元素进行比较,然后,再将该元素插入到合适位置.当一趟希尔排序完成后,处于增量位置上的元素是有序的. ②希尔排序算法的效率依赖于增量的选取 假设增量序列为 h(1),h(2).....h(k),其中h(1)必须为1,且h(1)<h(2)<...h(k) . 第一趟排序时在增量为h(k)的各个元

算法—3.希尔排序

对于大规模乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从数组的一端移动到另一端.例如,如果主键最小的元素正好在数组的尽头,要将它挪到正确的位置就需要N-1次移动.希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序. 1.基本思想 希尔排序的思想是使数组中任意间隔为h的元素都是有序的.这样的数组被称为h有序数组.换句话说,一个h有序数组就是h个互相独立的有序数组编织在一起组成的一个数组(见下图).在进行排