#include <iostream> using namespace std; void print(int a[], int n ,int i) { cout<<"处理a["<<i<<"]"<<": "; for(int j= 0; j<8; j++) { cout<<a[j]<<" "; } cout<<endl; } void shell_sort(int a[], int n) { int i, j, temp, dk; dk = n; while((dk/=2) > 0) { cout<<"步长为"<<dk<<"时候的排序过程:"<<endl; for(i=dk; i < n; ++i) /*默认开始的时候前面是一个排好序的序列,开始时默认前面一个数是排好序*/ { if(a[i] < a[i-dk]) /*需要插入的元素与排好序的序列最后一个元素做比较*/ /*只有不满足大小关系时才到序列中查找插入位置*/ { temp = a[i]; /*复制为哨兵,即存储待插入元素*/ a[i] = a[i-dk]; /*首先后移一个元素*/ j = i - dk; while(j>=0 && temp<a[j]) /*查找在有序表的插入位置,注意数组越界的判断*/ { a[j+dk] = a[j]; /*元素后移*/ j -= dk; } a[j+dk] = temp; /*插入到正确位置*/ } print(a, n, i); } } } int main() { int a[8] = {3, 1, 5, 7, 2, 4, 9, 6}; int i; cout<<"初始序列: "; for(i=0; i < sizeof(a)/sizeof(int); i++) cout<<a[i]<<" "; cout<<endl; shell_sort(a, sizeof(a)/sizeof(int)); /*希尔插入排序*/ }程序运行效果截图:
原文地址:http://blog.csdn.net/laoniu_c/article/details/38556733