有一组数据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 // 因为上面的覆盖 此时会多出来两个相同的值 这个就是插入点 将值插入即可
}
}