标签:分代 解析 else https 移动 插入 log 存储空间 直接
对序列:6,5,8,4,3,1 进行直接插入排序
int main() { int a[10] = { 6,5,8,4,3,7 }; int temp, j; for (int i = 1; i < 6; ++i){ temp = a[i]; for (j = i - 1; j >= 0 && temp < a[j]; --j){ a[j + 1] = a[j]; } a[j + 1] = temp; } j = 0; while (j < 6){ printf("%d", a[j]); ++j; } return 0; }
由直接插入排序代码,选取最内层
a[j + 1] = a[j];
作为基本操作语句
综上所述,本算法的平均时间复杂度O(n^2)
对序列:13,38,49,65,76,97,27,49进行一趟折半插入排序。
前6个元素已经排好序列,查找27的插入位置
int main() { // a[0]为存储临时变量的位置 int a[9] = { 0, 13, 38, 49, 65, 76, 97, 27, 49 }; int low, high, mid; for (int i = 2; i <= 8; ++i){ a[0] = a[i]; low = 1; high = i - 1; while (low <= high){ mid = (low + high) / 2; if (a[mid] > a[0]){ high = mid - 1; } else{ low = mid + 1; } } for (int j = i - 1; j >= high + 1; --j){ a[j + 1] = a[j]; } a[high + 1] = a[0]; } int j = 0; while (j < 8){ printf("%d ", a[j]); ++j; } return 0; }
同直接插入排序,O(1)
将待排序列分成几个子序列,分别对这几个子序列进行直接插入排序
如果增量是1,那么就是直接插入排序
先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d
对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序
当增量减到1时,整个要排序的数被分成一组,排序完成
void ShellSort(int r[],int n){ int i,j,d; int x; d=n/2;//d=n>>1 while(d>=1){ for(i=d ;i<n;i++){ x=r[i]; for(j=i-d;j>=0;j-=d){ if(r[j]>x){ r[j+d]=r[j]; }else{ break; } } r[j+d]=x; }//for i d>>=1; }//while }//ShellSort
增量序列的最后一个值一定取1
增量序列中的值尽量没有除1之外的公因子
标签:分代 解析 else https 移动 插入 log 存储空间 直接
原文地址:https://www.cnblogs.com/YC-L/p/12689017.html