{3,1,7,5,2,4,9,6}
排序的过程如下:
#include <stdio.h> #include <stdlib.h> void insert(int arr[], int temp[], int n) { int i,first,final,k; first = final = 0;//分别记录temp数组中最大值和最小值的位置 temp[0] = arr[0]; for (i = 1; i < n; i ++){ // 待插入元素比最小的元素小 if (arr[i] < temp[first]){ first = (first - 1 + n) % n; temp[first] = arr[i]; } // 待插入元素比最大元素大 else if (arr[i] > temp[final]){ final = (final + 1 + n) % n; temp[final] = arr[i]; } // 插入元素比最小大,比最大小 else { k = (final + 1 + n) % n; //当插入值比当前值小时,需要移动当前值的位置 while (temp[((k - 1) + n) % n] > arr[i]) { temp[(k + n) % n] =temp[(k - 1 + n) % n]; k = (k - 1 + n) % n; } //插入该值 temp[(k + n) % n] = arr[i]; //因为最大值的位置改变,所以需要实时更新final的位置 final = (final + 1 + n) % n; } } // 将排序记录复制到原来的顺序表里 for (k = 0; k < n; k ++) { arr[k] = temp[(first + k) % n]; } } int main() { int a[8] = {3,1,7,5,2,4,9,6}; int temp[8]; insert(a,temp,8); for (int i = 0; i < 8; i ++){ printf("%d ", a[i]); } return 0; }运行结果为: 1 2 3 4 5 6 7 9 2-路插入排序相比于折半插入排序,只是减少了移动记录的次数,没有根本上避免,所以其时间复杂度仍为
O(n2)
。
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有