#include <stdio.h> #include <stdlib.h> /*函数声明部分*/ void insert_sort(int par_array[], int array_size); void print_array(int par_array[], int array_size); void shell_sort(int par_array[], int array_size); /*函数定义部分*/ void print_array(int par_array[], int array_size) { int i; for(i = 0; i < array_size; ++i) printf("%d/t", par_array[i]); printf("/n"); } /* * 插入排序 * 采用改进的插入排序算法 * 将待插入的记录a[i]的关键字从右到左一次与有序区中的记录a[j](j=i-1,i-2,...1)的关键字比较: * 1.如果a[j]的关键字大于a[i]的关键字,则将a[j]后移一位 * 2.如果a[j]的关键字小于或等于a[i]的关键字,则查找过程结束,(j+1)即为a[i]的插入位置 */ void insert_sort(int par_array[], int array_size) { int i,j; int temp; for(i = 1; i < array_size; i++) { temp = par_array[i]; for(j = i-1; j >= 0; j--) { if(temp < par_array[j]) { par_array[j+1] = par_array[j]; } else break; } par_array[j+1] = temp; } } /* * 希尔排序 * 改进的插入排序算法 * 算法先将要排序的一组数按某个增量d分成若干组,对每个组中全部元素进行排序, * 然后用一个较小的增量对它进行再次分组,并对每个新组进行排序, * 当增量减到1时,整个要排序的数被分成一组,排序完成。 */ void shell_sort(int par_array[], int array_size) { int i,j; int h; int temp; for(h = array_size/2; h > 0; h=h/2)/*控制增量*/ { for(i = h; i < array_size; i++) { temp = par_array[i]; for(j = i-h; j >= 0; j-=h) { if(temp < par_array[j]) { par_array[j+h] = par_array[j]; } else break; } par_array[j+h] = temp; } } } /*测试用例*/ int main() { int i_array[] = {7,3,5,8,9,1,2,4,6}; int array_size = sizeof(i_array)/sizeof(int); int i_array2[] = {7,3,5,8,9,1,2,4,6}; int array_size2 = sizeof(i_array2)/sizeof(int); printf("Before insert_sort:/n"); print_array(i_array, array_size); insert_sort(i_array, array_size); printf("After insert_sort/n"); print_array(i_array, array_size); printf("Before shell_sort:/n"); print_array(i_array2, array_size2); shell_sort(i_array2, array_size2); printf("After shell_sort/n"); print_array(i_array2, array_size2); system("pause"); } /* Before insert_sort: 7 3 5 8 9 1 2 4 6 After insert_sort 1 2 3 4 5 6 7 8 9 Before shell_sort: 7 3 5 8 9 1 2 4 6 After shell_sort 1 2 3 4 5 6 7 8 9 请按任意键继续. . . */