C++算法:基础排序练习

发布于 2022-09-07  3 次阅读


选择排序

选择排序,对输入的n个数字进行升序排列。

输入

第一行一个数n,

第二行n个待排序的数字a~i~。

输出

一行升序排列,n个用空格隔开的数字。

输入样例

4
4 3 2 1

输出样例

1 2 3 4

说明/提示

对100%数据,n≤1000,a~i~≤1000000。

题解

完整代码及注释说明

#include <iostream>
using namespace std;
// 定义数组
int arr[] = {};
// 交换函数
void swap_(int &a, int &b){
    int temp = a;
    a = b;
    b = temp;
}
// 选择排序
void selectSort(int arr[], int n){
    for (int i = 0; i < n - 1; i++){
        // 找到最小值的索引
        int minIndex = i;
        for (int j = i + 1; j < n; j++){
            // 如果找到比最小值小的,则更新最小值的索引
            if (arr[j] < arr[minIndex]){
                // 将最小值的索引更新为当前值的索引
                minIndex = j;
            }
        }
        // 将最小值与当前值交换
        swap_(arr[i], arr[minIndex]);
    }
}
int main(){
    int a;
    cin >> a;
    // 初始化数组
    for (int i = 0; i < a; i++) {
        int b;
        cin >> b;
        arr[i] = b;
    }
    // 
    selectSort(arr, a);
    // 输出数组
    for (int i = 0; i < a; i++) {
        cout << arr[i] << " ";
    }
    return 0;
}

冒泡排序

对输入的n个数字进行升序排列。每趟冒一个当前最大数字到后面。依次输出每一趟排序的结果,。

输入

第一行一个数n,

第二行n个待排序的数字a~i~。

输出

n行,每行n个用空格隔开的数字,表示这一次的结果。

输入样例

4
4 3 2 1

输出样例

3 2 1 4
2 1 3 4
1 2 3 4
1 2 3 4

说明/提示

对100%数据,n≤1000,a~i~≤1000000。

题解

完整代码及注释说明

#include <iostream>
using namespace std;
// 定义数组
int arr[] = {};
// 交换函数
void swap_(int &a, int &b){
    int temp = a;
    a = b;
    b = temp;
}
// 冒泡排序
void bubbleSort(int arr[], int n){
    // 循环n-1次
    for (int i = 0; i < n; i++) {
        // 循环n-i-1次
        for (int j = 0; j < n - i - 1; j++) {
            // 如果前面的数比后面的数大,则交换
            if (arr[j] > arr[j + 1]) {
                swap_(arr[j], arr[j + 1]);
            }
        }
        // 打印每次排序后的数组
        for (int k = 0; k < n; k++) {
            cout << arr[k] << " ";
        }
        cout << endl;
    }
}
int main(){
    int a;
    cin >> a;
    // 初始化数组
    for (int i = 0; i < a; i++) {
        int b;
        cin >> b;
        arr[i] = b;
    }
    // 调用冒泡排序函数
    bubbleSort(arr, a);
    return 0;
}

纸牌插排

纸牌牌面从小到大的顺序依次为3~10,J,Q,K,1,2,小王,大王。

输入

20张牌的大小,其中1~10用数字本身表示,JQK用11,12,13表示,小王和大王用20和30表示。

输出

整理好顺序的20张牌的大小,空格隔开。

输入样例

2 1 4 4 3 6 10 13 12 11 30 20 7 8 9 4 5 5 5 5

输出样例

3 4 4 4 5 5 5 5 6 7 8 9 10 11 12 13 1 2 20 30

完整代码及注释说明

#include <iostream>
using namespace std;
// 定义数组
int arr[] = {};
// 插入排序
void insertSort(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];
            j--;
        }
        // 插入元素
        arr[j + 1] = temp;
    }
}
int main(){
    int a = 20;
    // 初始化数组 
    for (int i = 0; i < a; i++) {
        int b;
        cin >> b;
        // 将输入的1和2转换为14和15
        if (b == 1 ) arr[i] = 14;
        else if (b == 2 ) arr[i] = 15;
        else arr[i] = b;
    }
    // 调用排序函数
    insertSort(arr, a);
    // 输出排序的结果
    for (int l = 0; l < a; l++) {
        // 将14和15转换为1和2输出
        if (arr[l]==14) cout << 1 << " ";
        else if(arr[l]==15) cout << 2 << " ";
        else cout << arr[l] << " ";
    }
    cout << endl;
    return 0;
}


本当の声を響かせてよ