DS|排序

发布时间:2024年01月06日

题目一:DS排序 -- 直插排序

题目描述:

给定一组数据,使用直插排序完成数据的升序排序。

输入要求:

数据个数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 <iostream>
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;
}

题目二:DS排序 -- 希尔排序

题目描述:

给出一个数据序列,使用希尔排序算法进行降序排序。

间隔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 <iostream>
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;
    }
}

问题三:DS排序 -- 冒泡排序

题目描述:

给定一个包含从0到n-1各一次的数组,若使用冒泡排序将其排为升序,问其中需要进行多少次交换

输入要求:

测试数据有多组,

每组由两行组成:第一行包含正整数n(n <= 5000); 下一行包含从0到n-1的n个整数的序列。

输出要求:

对于每组测试数据,

输出交换次数

输入样例:

10
1 3 6 9 0 8 5 7 4 2

输出样例:

22

代码示例:

#include <iostream>
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;
}

问题四:DS排序 -- 快速排序

题目描述:

给出一个数据序列,使用快速排序算法进行从小到大的排序

输入要求:

第一行输入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<iostream>
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;
    }
}

题目五:DS排序 -- 简单选择排序

题目描述:

给出一个数据序列,使用简单选择排序算法进行升序排序。

输入要求:

第一行输入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<iostream>
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;
	}
}

题目六:DS排序 -- 堆排序

题目描述:

给定一组数据,使用堆排序完成数据的降序排序。(建小顶堆)。

输入要求:

数据个数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<iostream>
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();
}

文章来源:https://blog.csdn.net/2203_75720729/article/details/135426667
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。