不假思索的写出这样的代码:
/*N:数组长度*/ for (i = 1; i < N; i++){ int t = i; while (t > 0?a[t]<a[t-1]:0){ int k = a[t]; a[t] = a[t - 1]; a[t - 1] = k; t = t - 1; } }
不停与前一个元素比较,如果顺序不对那么交换;如果顺序对了,那么原a[i]里的元素已经找到了位置。a[0..i-1]的元素都是有序的,也就是书中所谓的“循环不变式”。
另:while循环中的表达式能不能写成“t > 0 && a[t] < a[t-1]”?似乎有可能出现访问越界?还请指点迷津。
而根据书上给出的伪代码写出来则是:
for (i = 1; i < N; i++){ int t = a[i], j = i - 1; while (j >= 0 && a[j] > t){ a[j + 1] = a[j]; j--; } a[j + 1] = t; }
没有明显的交换,实际上和“找出a[i]应在的位置a[k],将a[k+1..i-1]的元素后移一位”是相同的原理,但是书中这样写明显简洁了很多。
时间: 2024-10-18 23:41:52