22计算机408考研—数据结构—冒泡排序

227 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
        }
    }

}