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; } }數組