有一组数据8 2 3 1 10 9 6
插入排序的思维:
先将第二个数字和第一个进行比较:如果后者较小
将8和2进行交换
结果:2 8 3 1 10 9 6
之后看3: 3小于8 所以交换之 然后3比2大 符合正确顺序 则不交换
结果2 3 8 1 10 9 6
之后看1 1比8小 交换 比3小交换 比2小 交换
结果1 2 3 8 10 9 6
以此类推...
错误代码:
template<typename T> void insertSelection(T* arr, int N) { for (int i = 1; i < N; ++i) { T key = arr[i]; int j; for (j = i - 1; j > 0 && arr[j] < key; j--) { arr[j] = arr[j - 1]; } arr[j] = key; } }
代码理解:选取一个待比较值,用来进行插入
T key = arr[i];
arr[j+1] = arr[j]用来进行移动为什么不用swap进行交换呢? 因为key要进行插入
为什么是arr[j + 1] = arr[j] 而不是arr[j] = arr[j - 1]
因为是拿后面的值和key进行比较:
正确代码:
void insertSelectionTwo(int* arr, int N){ for(int i = 1; i<N; ++i){ int temp = arr[i]; int j = i - 1; //用于比较的参数 while (j > 0 && arr[j] > temp) { arr[j + 1] = arr[j]; //为了空出来一个值插入要插入的key 所以才覆盖值
j--; } arr[j+1] = temp // 因为上面的覆盖 此时会多出来两个相同的值 这个就是插入点 将值插入即可 } }