排序算法 —— 快速排序
生活随笔
收集整理的這篇文章主要介紹了
排序算法 —— 快速排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
快速排序算法介紹
劃分問題:把數組的各個元素重排后分成左右兩個部分,使得左邊任意元素都小于或等于右邊任意元素。
遞歸求解:把左右兩部分分別排序。
快速排序代碼
#include <iostream> using namespace std; void swap(int & a,int & b) {//交換變量a,b值int tmp=a;a=b;b=tmp; } void QuickSort(int a[],int s,int e) {if(s>=e)return ;int k=a[s];int i=s,j=e;while(i!=j){while(j>i&&a[j]>=k) --j;swap(a[i],a[j]);while(i<j&&a[i]<=k) ++i;swap(a[i],a[j]);}//處理完后,a[i]=kQuickSort(a,s,i-1);QuickSort(a,i+1,e); } int a[]={93,27,30,2,8,12,2,8,30,89}; int main () {int size=sizeof(a)/sizeof(int);QuickSort(a,0,size-1);for(int i=0;i<size;++i){cout<<a[i]<<",";}cout<<endl;return 0; }快速選擇問題
輸入n個整數和一個正整數k(1<=k<=n),輸出這些整數從小到大排序后的第k個,n<=107。
分析
假設在快速排序的“劃分”結束后,數組A[p……r]被分成了A[p……q]和A[q+1……r],則可以根據左邊的元素個數q-p+1和k的大小關系只在左邊或者只在右邊遞歸求解。
代碼
#include <iostream> #include <algorithm>using namespace std;int qsort(int *a, int left, int right, int k) {//快速排序算法if (left > right) return 0; //遞歸邊界int centerV = a[left + (right - left) / 2]; //取標兵值int i = left, j = right;while (i <= j) {while (i <= j) {//從左往右掃描大于標兵值的元素,放在標兵值右側if (a[i] >= centerV) break;i++;}while (j >= i) {//從右往左掃描小于標兵值的元素,放在標兵值左側if (a[j] <= centerV) break;j--;}if (i > j) break; //退出條件swap(a[i], a[j]);i++;j--;}if (k - 1 <= i) //遞歸求左半解return qsort(a, left, j, k);else if (k - 1 > i + 1) //遞歸求右半解return qsort(a, i, right, k);elsereturn a[k - 1]; }int QuickSort(int *pInt, int n, int k) {return qsort(pInt, 0, n - 1, k); }int main() {int a[10] = {1, 2, 3, 4, 9, 33, 12, 8, 9, 10};int n = 10, k = 9;cout << "Before sorting: ";for (int i = 0; i < n; ++i) {cout << a[i] << ' ';}cout << endl;int ans = QuickSort(a, n, k);cout << "After sorting: ";for (int i = 0; i < n; ++i) {cout << a[i] << ' ';}cout << endl;cout << "Number " << k << " is: " << ans << endl;return 0; }總結
以上是生活随笔為你收集整理的排序算法 —— 快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2010年第一届蓝桥杯省赛 —— 第二题
- 下一篇: Codeforces Round #55