选择排序是每次选择出最小的放到已经排好的数组后面,而插入排序是依次选择一个元素,插入到前面已经排好序的数组中间,确保它处于正确的位置,当然,这是需要已经排好的顺序数组不断移动。步骤描述如下:
1.从第一个元素开始,可以认为第一个元素已经排好顺序。
2.取出后面一个元素 n,在前面已经排好顺序的数组里从尾部往头部遍历,假设正在遍历的元素为 nums[i],如果 num[i] > n,那么将 nums[i] 移动到后面一个位置,直到找到已经排序的元素小于或者等于新元素的位置,将 n 放到新腾空出来的位置上。如果没有找到,那么 nums[i] 就是最小的元素,放在第一个位置。
3.重复上面的步骤 2,直到所有元素都插入到正确的位置。
以数组 [98,90,34,56,21] 为例,动态排序过程如下:
1.具体的排序过程如下:
第一次假设第一个元素已经排好,第二个元素 90 往前面查找插入位置,正好查找到 98 的位置插入,第二轮是 34 选择插入位置,选择了第一个元素 90 的位置插入,其后面的元素后移。
第三轮排序则是 56 选择适合自己的位置插入,第四轮是最后一个元素 21 往前查找适合的位置插入。
#include <iostream>
using namespace std;
void insertionSort(int nums[],int size);
void printf(int nums[],int size);
int main() {
int nums[] = {98,90,34,56,21};
int size = sizeof(nums)/sizeof(nums[0]);
printf(nums,size);
insertionSort(nums,size);
return 0;
}
void insertionSort(int nums[],int size) {
if (nums == NULL) {
return;
}
int index, temp;
for (int i = 1; i < size; i++) {
// 当前选择插入的元素前面一个索引值
index = i - 1;
// 当前需要插入的元素
temp = nums[i];
while (index >= 0 && nums[index] > temp) {
nums[index + 1] = nums[index];
index--;
}
// 插入空出来的位置
nums[index + 1] = temp;
cout<<"第" << i << "轮插入结果:"<<endl;
printf(nums,size);
}
}
void printf(int nums[],int size){
for (int i = 0; i < size; i++) {
cout<<nums[i]<<" ";
}
cout<<endl;
}