for j = 2 to length(A) //外层循环从第二个元素开始,由于第一个元素认为是有序的 do key = A[j] // Insert A[j] into the sorted sequence A[1..j-1] i = j - 1; //内层循环的索引从j-1开始 while( i > 0 and A[i] > key) //找到第一个小于等于key的索引 do A[i+1] = A[i] //对于大于key的作后移处理 i = i -1 A[i+1] = key // 将key插入到第一个索引后
void InsertSort(int* a, int len) { int i, j, key; for(j = 1; j < len; ++j) { key = a[j]; i = j - 1; while(i >=0 && a[i] > key) { a[i+1] = a[j]; } a[i+1] = key; }``` # 循环不变式: - 初始化:在第一轮迭代开始前是正确的 - 保持:若是循环的某一次迭代前它是正确的,那么下次迭代前它也应该保持正确 - 终止:循环结束 # 习题: ## 2.1-1 31 41 59 26 41 58 // src 31 **41** 59 26 41 58 // 1 31 41 **59** 26 41 58 // 2 26 31 41 59 41 58 // 3 26 31 41 41 59 58 // 4 26 31 41 41 58 59 // 5 ## 2.1-2 升序(C语言)
void InsertSort(int *a, int len) { int i, j, key; for(i = 1; i < len; ++i) { key = a[i]; j = i - 1; while(j >=0 && a[j] < key) { a[j+1] = a[j]; j = j -1; } a[j+1] = key; } }数组