排序算法实例
第 3 页 共 13 页
2 折半插入排序
/*
orginal:
[ 0 ] 49 38 65 97 76 13 27 49
sorting...
[ 38 ] 38 49 65 97 76 13 27 49
[ 38 ] 38 49 65 97 76 13 27 49
[ 38 ] 38 49 65 97 76 13 27 49
[ 76 ] 38 49 65 76 97 13 27 49
[ 13 ] 13 38 49 65 76 97 27 49
[ 27 ] 13 27 38 49 65 76 97 49
[ 49 ] 13 27 38 49 49 65 76 97
sorted:
[ 49 ] 13 27 38 49 49 65 76 97
折半插入排序算法的描述:
是直接插入排序的改进,主要在于缩短了查找待排序的元素 data[i]位于有序区的插入点的过程,
由于有序区的元素已经排好序,所以可以通过折半查找的方法快速找到 data[i]应该落入的插入点,其余
过程和直接插入排序方法相同,虽然加快了查找插入点的过程,但是不能减少移动元素的数量。
*/
#include <stdio.h>
void insort(int data[], int length);
void output(int data[], int length);
main()
{
int data[] = { 0, 49, 38, 65, 97, 76, 13, 27, 49 };
printf("orginal:\n");
output(data, sizeof(data) / sizeof(int)); /*显示原始数据*/
printf( "sorting...\n" );
insort(data, sizeof(data) / sizeof(int) - 1); /*显示动态排序的过程*/
printf("sorted:\n");
output(data, sizeof(data) / sizeof(int)); /*输出排序结果*/
}
void insort(int data[], int length)
{
int i, j;
int low, high, mid;
for (i = 2; i <= length; i++) {
if (data[i] < data[i - 1]) {
data[0] = data[i];
// 通过对于有序区的折半查找,找到 data[i]应该落入的插入点
low = 1;
high = i - 1;
while (low <= high) {
mid = (low + high) / 2;
if (data[0] < data[mid])
high = mid - 1;
else
low = mid + 1;
}// 折半查找结束,high+1 所指向的位置应为插入点,
//下面的循环将(i-1)~(high+1)区间的数据依次后移一个位置,腾出 high+1 的所指的位置,将 data[i]存入
for (j = i - 1; j >= high + 1; j--) {
data[j + 1] = data[j];
}
data[j + 1] = data[0];
}
output(data, length + 1);
}
}
void output(int data[], int length) //数据输出函数
{
int i;