数据结构之折半插入排序

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_36880027/article/details/100141008

折半插入排序和直接插入排序,仅仅是在寻找插入点的性能上有所改变,对于整体的时间复杂度的数量级,没有贡献。

测试代码如下:

/折半插入排序
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 20

typedef struct{ //记录类型 
	int key;    //关键字 
	char data;  //数据
}record;

typedef struct{
	record rec[MAXSIZE+1]; //包含MAXSIZE+1个记录,记录0是哨兵,相当于tmp 
	int length;            //顺序表的长度 
}sqList;

int main()
{
	sqList L; 
	L.length = MAXSIZE; 
	
	//使用随机数据初始化sqList中的数据
	for(int i = 1;i<=L.length;i++)  
	{
		L.rec[i].key = rand()%23;
		L.rec[i].data = 'a' + L.rec[i].key; 
	}
	
	//输出排序前的记录 
	for(int i = 1;i<=L.length;i++)
		printf("record %2d: key = %2d, data = %c\n",i,L.rec[i].key,L.rec[i].data);
	
	//关键字排序,i从第2个记录开始比较 
	for(int i = 2;i<=L.length;i++) 
	{
		int low = 1,mid,high = i-1;
		L.rec[0] = L.rec[i];
		while(low<=high) 			//折半查找待插入的位置; 
		{
			mid = (low + high)/2;
			if(L.rec[mid].key<L.rec[0].key)
				low = mid + 1;
			else 
				high = mid - 1;
		}//退出while循环时high之后的单元为待插入的单元 
		for(int j = i-1;j>=low;j--) //或者将low换成high+1 
			L.rec[j+1] = L.rec[j];
		L.rec[low] = L.rec[0];      //或者将low换成high+1 
	}
	
	//输出排序后的记录 
	printf("\n------>折半插入排序后<------\n");
	for(int i = 1;i<=L.length;i++)
		printf("record %2d: key = %2d, data = %c\n",i,L.rec[i].key,L.rec[i].data);
	
	return 1;
} 

运行结果如下:

record  1: key = 18, data = s
record  2: key = 21, data = v
record  3: key =  9, data = j
record  4: key =  4, data = e
record  5: key = 10, data = k
record  6: key = 15, data = p
record  7: key =  1, data = b
record  8: key = 10, data = k
record  9: key =  6, data = g
record 10: key = 15, data = p
record 11: key =  1, data = b
record 12: key = 16, data = q
record 13: key =  5, data = f
record 14: key = 14, data = o
record 15: key =  2, data = c
record 16: key =  8, data = i
record 17: key =  5, data = f
record 18: key =  5, data = f
record 19: key = 20, data = u
record 20: key =  8, data = i

------>折半插入排序后<------
record  1: key =  1, data = b
record  2: key =  1, data = b
record  3: key =  2, data = c
record  4: key =  4, data = e
record  5: key =  5, data = f
record  6: key =  5, data = f
record  7: key =  5, data = f
record  8: key =  6, data = g
record  9: key =  8, data = i
record 10: key =  8, data = i
record 11: key =  9, data = j
record 12: key = 10, data = k
record 13: key = 10, data = k
record 14: key = 14, data = o
record 15: key = 15, data = p
record 16: key = 15, data = p
record 17: key = 16, data = q
record 18: key = 18, data = s
record 19: key = 20, data = u
record 20: key = 21, data = v

--------------------------------
Process exited after 0.1426 seconds with return value 1
请按任意键继续. . .

猜你喜欢

转载自blog.csdn.net/qq_36880027/article/details/100141008