ok,言歸正傳,現在就說快速排序。
// 快速排序
void
print
(int a[
], int n)
//輸出函式
cout<}void
swap
(int *a, int *b)
//交換函式
int partition
(int a[
], int low, int high)
//區間內排序
print
(a,10);
return low;
}void
quicksort
(int a[
], int low, int high)
//區間劃分
}
從最簡單的開始。兩個數如何排序?交換位置就可以了;三個數如何排序?一其中乙個為基點,於其他的數進行比較就ok了。那麼,我們可以把所有的排序歸攏到簡單問題嗎?這種思想在計算機裡被稱為分治法(超有用)。
簡述分治法,解釋起來就是 「大事化小,小事化了」 ,把複雜的問題變成簡單的問題,又點像遞迴,但是遞迴是有規律可循的,分治沒有。分治只需要簡單問題的解法,不需要知道簡單問題到複雜問題的規律。
分治需要大事化小,小事化了,所以需要分好區塊。想想對於每個數來說排序是什麼?就是小的在我左邊,大的在我右邊。所以我們先把第乙個數(arr[0])放到該去的位置,然後我們就會發現,陣列已經被分成兩個區了,乙個比arr[0]小,乙個比arr[0]大,以此類推,分別處理兩個區直到每個區只有三個數,然後用處理簡單問題的方式處理。
// 快速排序
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include<
set>
#include
using namespace std;
void
print
(int a[
], int n)
cout<}void
swap
(int *a, int *b)
int partition
(int a[
], int low, int high)
print
(a,10);
return low;
}void
quicksort
(int a[
], int low, int high)
}int main()
; cout<<
"初始值:"
;print
(a,10);
quicksort
(a,0,9
);cout<<
"結果:"
;print
(a,10);
}
快排的實用性不大,但是思想是很好的,建議學習時筆推一遍**,體會一下分割槽的感覺和方法。 遞迴 快速排序 快速排序
問題描述 用遞迴來實現快速排序 quick sort 演算法。快速排序演算法的基本思路是 假設要對乙個陣列a進行排序,且a 0 x。首先對陣列中的元素進行調整,使x放在正確的位置上。同時,所有比x小的數都位於它的左邊,所有比x大的數都位於它的右邊。然後對於左 右兩段區域,遞迴地呼叫快速排序演算法來進...
排序 快速排序
快速排序時實踐中最快的一直排序,平均時間是0 nlogn 最壞的情況是o n2 但是很容易將這種情況避免 空間複雜度 o n lgn 不穩定。快速排序時基於分治模式處理的,對乙個典型子陣列a p.r 排序的分治過程為三個步驟 1.分解 a p.r 被劃分為倆個 可能空 的子陣列a p q 1 和a ...
排序 快速排序
定義 在快速排序演算法中,使用了分治策略,將要排序的序列分成兩個子串行,然後遞迴地對子序列進行排序,直到整個序列排序完畢。步驟 1.在序列中選擇乙個關鍵元素作為軸 2.對序列進行重新排序,將比軸小的元素移到軸的前邊,比軸大的元素移動到軸的後面。在進行劃分之後,軸便在它最終的位置上 3.遞迴地對兩個子...