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

选择排序

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

输入

第一行一个数n,

第二行n个待排序的数字ai

输出

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

输入样例

1
2
4
4 3 2 1

输出样例

1
1 2 3 4

说明/提示

对100%数据,n≤1000,ai≤1000000。

题解

完整代码及注释说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#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个待排序的数字ai

输出

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

输入样例

1
2
4
4 3 2 1

输出样例

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

说明/提示

对100%数据,n≤1000,ai≤1000000。

题解

完整代码及注释说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#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张牌的大小,空格隔开。

输入样例

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

输出样例

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

完整代码及注释说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#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;
}