算法思想:
算法模板:
1 void quick_sort(int q[], int l, int r) 2 { 3 //递归的终止情况 4 if(l >= r) return; 5 //第一步:分成子问题 6 int i = l - 1, j = r + 1, x = q[l + r >> 1]; 7 while(i < j) 8 { 9 do i++; while(q[i] < x); 10 do j--; while(q[j] > x); 11 if(i < j) swap(q[i], q[j]); 12 } 13 //第二步:递归处理子问题 14 quick_sort(q, l, j), quick_sort(q, j + 1, r); 15 //第三步:子问题合并.快排这一步不需要操作,但归并排序的核心在这一步骤 16 }
例题: 给定你一个长度为 nn 的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 nn。 第二行包含 nn 个整数(所有整数均在 1∼1091∼109 范围内),表示整个数列。 输出格式 输出共一行,包含 nn 个整数,表示排好序的数列。 数据范围 1≤n≤1000001≤n≤100000 输入样例: 5 3 1 2 4 5 输出样例: 1 2 3 4 5
#include<bits/stdc++.h> using namespace std; const int N = 100010; int n; int q[N]; void quick_sort(int a[], int l, int r) { if (l >= r) return; int i = l - 1, j = r + 1; int num = a[l + r >> 1]; while(j > i) { do i ++; while(a[i] < num); do j --; while(a[j] > num); if (i < j) swap(a[i], a[j]); } quick_sort( a, l, j); quick_sort( a, j + 1, r); } int main() { cin >> n; for (int i = 0; i < n; i ++) cin >> q[i]; quick_sort(q, 0, n - 1 ); for (int i = 0; i < n; i ++) cout << q[i] << " "; return 0; }
2022-03-27 23:02:39