通过对基准数归位结合递归完成对数据的排序,分而治之的思想。
描述
有 N (0 ≤ N ≤ 999999)个 -999999 到 999999 之间的随机整数 X(-999999≤ X ≤999999)需要进行排序,请给分别出升序排序与降序排序的结果。
输入
输入第一行有一个正整数 N,代表需要排序的随机整数个数。
第二行包含所有需要排序的随机整数,以空格隔开。
输出
输出有2行,分别为升序输出与降序输出的结果。
输入样例
5 -98 0 2 41 7
l
输出样例
-98 0 2 7 41 41 7 2 0 -98
C++ Code
#include<iostream> #include<Windows.h> using namespace std; void swap(int &a, int &b) {//交换两个数 int temp = a; a = b; b = temp; } void quickSort(int a[], int left, int right) { if (left > right) { return; } //markNumber为每一次选定的数,即数组的第一个元素 //将数组归位成 markNumber左边的数都小于markNumber //markNumber右边的数字都大于markNumber。即每一轮结束 int i = left, j = right, markNumber = a[left]; while (i!=j) { //从右往左找一个比markNumber小的数 while (a[j] >= markNumber && i<j) { j--; } //再从左往右找一个比markNumber大的数 while (a[i] <= markNumber && i < j) { i++; } //当i和j都没有相遇时 if (i<j) { swap(a[i],a[j]); } } //将markNumber置换到数组中间 swap(a[left], a[i]); quickSort(a, left, i - 1); quickSort(a, i + 1, right); return; } int main() { int n = 0; cin >> n;//输入需要排序的数字个数 int *arr = new int[n]; memset(arr, 0, sizeof(arr[0])*n);//memset初始化动态数组 如果使用 sizeof(arr)*n ,当输入数组时的数值过大时报错。 for (int i = 0; i < n; i++)//输入 { cin >> arr[i]; } //排序 quickSort(arr,0,n-1); for (int i = 0; i < n; i++)//正序输出 { cout << arr[i] << " "; } cout << endl; for (int i = n - 1; i >= 0; i--)//反序输出 { cout << arr[i] << " "; } system("pause"); return 0; }
核心思想是通过比较与交换相邻的两个元素完成对数据的排序。