#include <stdio.h>
#include <stddef.h>
#define ARR_SIZE 10
/* 函数原型 */
void bidir_insert( int keys[], int temp[], const size_t i );
int main(void)
{
size_t i;
int keys[ARR_SIZE] = { 1050, 100, 150, 20, 9000, 5110, 3008, 1450, 5220, 500 };
int temp[ARR_SIZE]; /* 辅助数组 */
/* 进行二路插入排序 */
bidir_insert(keys, temp, ARR_SIZE);
/* 输出排序结果 */
for ( i = 0; i < ARR_SIZE; ++i ) {
printf("%d ", keys[i]);
}
printf("\nPress ENTER to quit...\n");
getchar();
return 0;
}
/* Begin of bidir_insert 05-11-12 12:00 */
void bidir_insert( int keys[], int temp[], const size_t arr_size )
{
size_t i, first, final = first = 0;
temp[0] = keys[0]; /* 将第一个元素放入辅助数组 */
/* 利用辅助数组 temp 进行二路插入排序 */
for ( i = 1; i < arr_size; ++i ) {
if ( temp[final] <= keys[i] ) {
temp[++final] = keys[i];
} else if ( keys[i] <= temp[first] ) {
first = (first - 1 + arr_size) % arr_size;
temp[first] = keys[i];
} else {
size_t index;
for ( index = (final - 1 + arr_size) % arr_size; ;
index = (index - 1 + arr_size) % arr_size ) {
if ( temp[index] <= keys[i] ) {
size_t mid = final++;
/* 元素后移 */
while ( mid != index ) {
temp[(mid + 1) % arr_size] = temp[mid];
mid = (mid - 1 + arr_size) % arr_size;
}
temp[(index + 1) % arr_size] = keys[i];
break;
}
}
}
}
/* 将 temp 的内容按顺序复制到 keys 中 */
for ( i = 0; i < arr_size; ++i ) {
keys[i] = temp[first];
first = (first + 1) % arr_size;
}
} /* End of bidir_insert */
正文
二路插入排序 2006-08-20 12:05:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/manbuyuduan/17706.html
阅读(6496) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论