给定一组数据,使用直插排序完成数据的升序排序。
数据个数n,n个数据
直插排序的每一趟排序结果
7 34 23 677 2 1 453 3
23 34 677 2 1 453 3
23 34 677 2 1 453 3
2 23 34 677 1 453 3
1 2 23 34 677 453 3
1 2 23 34 453 677 3
1 2 3 23 34 453 677
#include
using namespace std;
void insertionSort(int arr[], int n) {
for (int i = 2; i <= n; i++) {
arr[0] = arr[i];
int j = i - 1;
while (arr[j] > arr[0]) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = arr[0];
for (int k = 1; k <= n; k++) {
cout << arr[k];
if (k == n) cout << endl;
else cout << " ";
}
}
}
int main() {
int n;
cin >> n;
int* arr = new int[n + 1];
for (int i = 1; i <= n; i++) cin >> arr[i];
insertionSort(arr, n);
return 0;
}
给出一个数据序列,使用希尔排序算法进行降序排序。
间隔gap使用序列长度循环除2直到1
第一行输入t,表示有t个测试示例
第二行输入n,表示第一个示例有n个数据(n>1)
第三行输入n个数据,都是正整数,数据之间用空格隔开
以此类推
对每组测试数据,输出每趟排序结果。不同组测试数据间用空行分隔。
2
6
111 22 6 444 333 55
8
77 555 33 1 444 77 666 2222
444 333 55 111 22 6
444 333 111 55 22 6
444 555 666 2222 77 77 33 1
666 2222 444 555 77 77 33 1
2222 666 555 444 77 77 33 1
#include
using namespace std;
void shellSort(int arr[], int n) {
for (int h = n / 2; h > 0; h /= 2) {
for (int i = h; i <= n; i++) {
arr[0] = arr[i];
int j = i - h;
while (j > 0 && arr[0] > arr[j]) {
arr[j + h] = arr[j];
j -= h;
}
arr[j + h] = arr[0];
}
for (int i = 1; i <= n; i++) {
cout << arr[i];
if (i != n) cout << " ";
}
cout << endl;
}
}
int main()
{
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
int* arr = new int[n + 1];
for (int i = 1; i <= n; i++) cin >> arr[i];
shellSort(arr, n);
cout << endl;
}
}
给定一个包含从0到n-1各一次的数组,若使用冒泡排序将其排为升序,问其中需要进行多少次交换
测试数据有多组,
每组由两行组成:第一行包含正整数n(n <= 5000); 下一行包含从0到n-1的n个整数的序列。
对于每组测试数据,
输出交换次数
10
1 3 6 9 0 8 5 7 4 2
22
#include
using namespace std;
void bubbleSort(int arr[], int n) {
int count = 0;
for (int i = n; i > 1; i--) {
for (int j = 1; j < i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr[j], arr[j + 1]);
count++;
}
}
}
cout << count << endl;
return;
}
int main() {
int n;
while (cin >> n) {
int* arr = new int[n + 1];
for (int i = 1; i <= n; i++) cin >> arr[i];
bubbleSort(arr, n);
}
return 0;
}
给出一个数据序列,使用快速排序算法进行从小到大的排序
第一行输入t,表示有t个测试示例
第二行输入n,表示第一个示例有n个数据
第三行输入n个数据,都是正整数,数据之间用空格隔开
以此类推
每组测试数据,输出每趟快排的结果,即每次排好一个数字结果(长度为1的子序列,不用排,不用输出)。不同测试数据间用空行分隔。
2
6
111 22 6 444 333 55
8
77 555 33 1 444 77 666 2222
55 22 6 111 333 444
6 22 55 111 333 444
6 22 55 111 333 444
6 22 55 111 333 444
1 33 77 555 444 77 666 2222
1 33 77 555 444 77 666 2222
1 33 77 77 444 555 666 2222
1 33 77 77 444 555 666 2222
1 33 77 77 444 555 666 2222
#include
using namespace std;
int n;
void quickSort(int q[], int low, int high) {
if (low >= high) return;
int i = low, j = high;
while (1) {
while (i < j) {
if (q[j] < q[i]) {
swap(q[i], q[j]);
break;
}
j--;
}
if (i >= j) break;
while (i < j) {
if (q[j] < q[i]) {
swap(q[i], q[j]);
break;
}
i++;
}
}
for (int i = 1; i <= n; i++) {
cout << q[i];
if (i != n) cout << " ";
}
cout << endl;
quickSort(q, low, j - 1);
quickSort(q, i + 1, high);
}
int main()
{
int t;
cin >> t;
while (t--) {
cin >> n;
int* arr = new int[n + 1];
for (int i = 1; i <= n; i++) cin >> arr[i];
quickSort(arr, 1, n);
cout << endl;
}
}
给出一个数据序列,使用简单选择排序算法进行升序排序。
第一行输入t,表示有t个测试示例
第二行输入n,表示第一个示例有n个数据(n>1)
第三行输入n个数据,都是正整数,数据之间用空格隔开
以此类推
对每组测试数据,输出每趟排序结果。不同组测试数据间用空行分隔。
2
5
12 58 36 47 96
10
1 3 6 9 0 8 5 7 4 2
12 58 36 47 96
12 36 58 47 96
12 36 47 58 96
12 36 47 58 96
0 3 6 9 1 8 5 7 4 2
0 1 6 9 3 8 5 7 4 2
0 1 2 9 3 8 5 7 4 6
0 1 2 3 9 8 5 7 4 6
0 1 2 3 4 8 5 7 9 6
0 1 2 3 4 5 8 7 9 6
0 1 2 3 4 5 6 7 9 8
0 1 2 3 4 5 6 7 9 8
0 1 2 3 4 5 6 7 8 9
#include
using namespace std;
const int N = 1010;
int n;
int arr[N];
void selectSort() {
int tmp;
for (int i = 1; i < n ; i++) {
int minIndex = i;
for (int j = i + 1; j <= n; j++) {
if (arr[minIndex] > arr[j]) minIndex = j;
}
swap(arr[i], arr[minIndex]);
for (int i = 1; i <= n; i++) {
cout << arr[i];
if (i != n) cout << " ";
}
cout << endl;
}
}
int main() {
int t;
cin >> t;
while (t--) {
cin >> n;
for (int i = 1; i <= n; i++) cin >> arr[i];
selectSort();
cout << endl;
}
}
给定一组数据,使用堆排序完成数据的降序排序。(建小顶堆)。
数据个数n,n个整数数据
初始创建的小顶堆序列
每趟交换、筛选后的数据序列,输出格式见样例
8 34 23 677 2 1 453 3 7
8 1 2 3 7 23 453 677 34
8 2 7 3 34 23 453 677 1
8 3 7 453 34 23 677 2 1
8 7 23 453 34 677 3 2 1
8 23 34 453 677 7 3 2 1
8 34 677 453 23 7 3 2 1
8 453 677 34 23 7 3 2 1
8 677 453 34 23 7 3 2 1
#include
using namespace std;
const int N = 1010;
int n;
int arr[N];
void printArray() {
cout << n << " ";
for (int i = 1; i <= n; i++) {
cout << arr[i];
if (i != n) cout << " ";
}
cout << endl;
}
void heapAdjust(int k, int len) {
arr[0] = arr[k];
for (int i = 2 * k; i <= len; i *= 2) {
if (i < len && arr[i] > arr[i + 1]) i++;
if (arr[0] <= arr[i]) break;
swap(arr[k], arr[i]), k = i;
}
}
void heapSort() {
for (int i = n / 2; i > 0; i--) heapAdjust(i, n);
printArray();
for (int i = n; i > 1; i--) {
swap(arr[i], arr[1]);
heapAdjust(1, i - 1);
printArray();
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> arr[i];
heapSort();
}