持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
2022计算机考研408—数据结构—排序 手把手教学考研大纲范围内的排序 22考研大纲数据结构要求的是C/C++,笔者以前使用的都是Java,对于C++还很欠缺, 如有什么建议或者不足欢迎大佬评论区或者私信指出
Talk is cheap. Show me the code. 理论到处都有,代码加例题自己练习才能真的学会
冒泡排序
思路: 从头到尾每两个相邻的元素,进行比较,前面的比后面的大就进行交换 循环一遍后,数组元素最大的就到了最后面, 第二次循环的时候,就可以不循环到最后一个了,最后一个上次循环已经是整个数组最大的值了 然后把这次最大的放到倒数第二个元素, 第三次循环的就可以忽略最后两个元素 以此类推,全部循环后,即可完成排序
#include <iostream>
#include <vector>
using namespace std;
void bubbleSort(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);
}
bubbleSort(num); //调用自定义的排序方法
cout << "排序后" << "\n";
for (int i = 0; i < num.size(); i++) {
cout << num[i] << " "; //输出
}
return 0;
}
void bubbleSort(vector<int> &num) {
for (int i = 0; i < num.size(); i++) {
for (int j = 0; j < num.size() - i; j++) {
if (num[j] > num[j + 1]) {
// int temp = num[j];
// num[j] = num[j + 1];
// num[j + 1] = temp;
num[j] ^= num[j + 1]; //两两相邻交换 上面注释代码的功能与此功能相等
num[j + 1] ^= num[j];
num[j] ^= num[j + 1];
}
}
//每次循环都把数组的变动输出出来
for (int j = 0; j < num.size(); j++) {
cout << num[j] << " ";
}
cout << "\n";
}
}
//冒泡排序的变种
#include <iostream>
#include <vector>
using namespace std;
void bubbleSort(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);
}
bubbleSort(num); //调用自定义的排序方法
for (int i = 0; i < num.size(); i++) {
cout << num[i] << " "; //输出
}
return 0;
}
void bubbleSort(vector<int> &num) {
int flag = 1; //flag用来判断,如果本次循环没有进行交换,该数组为有序数组
int arrBoundary = num.size() - 1; //用来记录上一次循环最后一次交换位置,后面没有交换的是有序的
int largestSwapIndex = 0; //记录最后一次交换的位置
for (int i = 0; i < num.size(); i++) {
flag = 1;
for (int j = 0; j < arrBoundary ; j++) {
if (num[j] > num[j + 1]) {
int temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
flag = 0; //发生交换就改为0
largestSwapIndex = j; //交换位置就给largestSwapIndex
}
}
arrBoundary = largestSwapIndex; //把当前循环交换的最后一个下标给arrBoundary
if (flag) { //如果本次循环没有交换任何值,证明当前数组为有序数组
break;
}
}
}