再优化:希尔排序(缩小增量排序) Donald Shell 从“减少记录个数”和“基本有序”这两个后面对直接插入进行了改进,提出希尔排序算法,通过将待排序记录按下标一定对增量分组(减少记录个数),对每组记录使用直接插入排序(基本有序),当增量减少至1时,整个序列基本有序,再对全部记录进行一次直接插入排序。
//插入排序: 插入第i个元素时,前面的i-1个已经排好序。//data[0]是哨兵,哨兵避免比较后需判断查找位置是否越界,提高效率。voidInsertSortList(int data[],int length){for(int i =2; i <= length; i++){
data[0]= data[i];int j = i-1;while(data[j]> data[0]){
data[j+1]= data[j];
j--;}
data[j+1]= data[0];}}//折半插入排序voidInsertBinarySort(int data[],int n){for(int i =2; i <= n; i++){
data[0]= data[i];int low =1;int high = i-1;while(low<=high){int mid =(low + high)/2;if(data[mid]< data[0]){
low = mid +1;}else{
high = mid -1;}}for(int j = i-1; j >= high+1; j--){
data[j+1]= data[j];}
data[high+1]= data[0];}}//希尔排序//此处data[0]仅作为暂存数据,不是哨兵。voidShellSort(int data[],int n){for(int d = n/2; d >=1; d = d/2){for(int i = d +1; i <= n; i++){
data[0]= data[i];int j = i - d;while(j >0&& data[0]< data[j]){
data[j+d]= data[j];
j = j-d;}
data[j+d]= data[0];}}}