持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
2022计算机考研408—数据结构—排序 手把手教学考研大纲范围内的排序 22考研大纲数据结构要求的是C/C++,笔者以前使用的都是Java,对于C++还很欠缺, 如有什么建议或者不足欢迎大佬评论区或者私信指出
Talk is cheap. Show me the code. 理论到处都有,代码加例题自己练习才能真的学会
直接插入排序
思路: 插入 == 把数插进去
也是两层循环
数组num
第一层循环从下标为1的值开始,循环变量为i
第二层循环就是把第一层的值拿出来,然后从第i-1个向前循环,找到第一个小于 num[i] 的值,
这个值的下标如果是j-1的话,那么 num[j] 就是第一个大于 num[i] 的值
把 num[i] 用一个变量 temp 保存一下
把下标为j到i-1的值依次向后移动一位,也就是说下标j到i-1的值移动到j+1到i,
然后把 temp(原num[i])放到下标为j的地方(之前的num[j]已经移动到num[j+1]了),
按照这种排序,每次循环的都是i之前的,i之前的元素都是顺序存储的,
文字表述的不清楚的可以看每次循环i更改后数组的元素情况
#include <iostream>
#include <vector>
using namespace std;
void insertSort(vector<int> &num);
int main() {
int n; //n为将要输入的数组长度
cin >> n; //输入n cin方法需要上面使用std
vector<int> num; //定义vector 记得上面导入vector
int temp; //temp为输入vector时的中间变量
for (int i = 0; i < n; i++) {
cin >> temp; //输入
num.push_back(temp);
}
insertSort(num); //调用自定义的排序方法
cout << "排序后" << "\n";
for (int i = 0; i < num.size(); i++) {
cout << num[i] << " "; //输出
}
return 0;
}
void insertSort(vector<int> &num) {
for (int i = 1; i < num.size(); i++) {
int temp = num[i]; //保存一下num[i]
int j;
//从num[j]向前开始找,一直找到比temp(原num[i])小的数就结束
//在循环过程中的数都比temp大的,不断地把temp大的数往后移动一位
//由此可得,等找到num[j]<=temp的时候,循环已经结束了
// 但是他的上一个,也就是num[j+1]的值已经移动到num[j+2]了
for (j = i - 1; j >= 0 && num[j] > temp; j--) {
num[j + 1] = num[j];
}
//可以直接把temp放到num[j+1],
num[j + 1] = temp;
//每次循环都可以把num[i]以及之前的数值排序好
//每次循环都把数组的变动输出出来
for(j = 0; j < num.size(); j++) {
cout << num[j] << " ";
}
cout <<"\n";
}
}
运行截图:
二分插入排序
思路: 二分插入和简单插入基本类似 不过是在寻找插入位置的时候不在采用简单插入的循环查找,而是使用二分查找 减少比较的次数,提升效率
#include <iostream>
#include <vector>
using namespace std;
void binInsertSort(vector<int> &num);
int main() {
int n; //n为将要输入的数组长度
cin >> n; //输入n cin方法需要上面使用std
vector<int> num; //定义vector 记得上面导入vector
int temp; //temp为输入vector时的中间变量
for (int i = 0; i < n; i++) {
cin >> temp; //输入
num.push_back(temp);
}
binInsertSort(num); //调用自定义的排序方法
cout << "排序后" << "\n";
for (int i = 0; i < num.size(); i++) {
cout << num[i] << " "; //输出
}
return 0;
}
void binInsertSort(vector<int> &num) {
for (int i = 1; i < num.size(); i++) {
int temp = num[i]; //保存临时变量
int left = 0; //使用二分法找到插入的位置left 使得num[left]<temp<num[left+1]
int right = i - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (num[mid] > temp) {
right = mid - 1;
} else {
left = mid + 1;
}
}
for (int j = i - 1; j >= left; j--) {
num[j + 1] = num[j]; //把left右面的值全部右移一位,
}
num[left] = temp; //把temp放到num[left]的位置
//每次循环都把数组的变动输出出来
for (int j = 0; j < num.size(); j++) {
cout << num[j] << " ";
}
cout << "\n";
}
}