先上實現了的c++**:
1 #include 2 #include 3 #include 4 #include 5using
namespace
std;
6const
int maxn = 100;7
inta[maxn], n;
8void quick_sort(int left, int
right)
12int i = left, j = right, key =a[left];
13while(i !=j)
17//
尋找分界點右邊比key小的數
18while(i < j && a[i] <=key)
21//
尋找分界點左邊比key大的數
22if(i !=j)
25//
如果找到了,則交換26}
27swap(a[left], a[i]);
28//
將key放到分界點的位置上,之後進行遞迴處理分界點兩側的資料
29 quick_sort(left, i - 1
);30 quick_sort(i + 1
, right);31}
32int
main()
38 quick_sort(0, n - 1
);39
for(int i = 0; i < n; i++)
42 printf("\n"
);43
return0;
44 }
下邊說說兩個注意點:
(1)關於quick_sort函式第一句,為什麼要判斷left是否大於right?
考慮這樣一組輸入資料:
10279 786 373 946 460 552 698 754 519 759
這組資料就是為什麼要有if(left > right)的原因,因為第一輪下來以後,i、j均為0(279比其他所有數都小),之後遞迴處理的時候,左邊的區間為(0, -1),不合法!
(2)為什麼每一輪查詢左右兩部分的時候,都要從右端開始(下標j)?
每一輪兩邊找的時候,都從右邊開始的原因是為了保證最終a[i]和a[left]交換的時候,a[i]>=a[left]
比如考慮這樣一組資料:
67 1 2 3 4 8
這樣如果從左邊先找,第一輪下來後,將會使得i為5,交換a[0]和a[5],左邊區間為0-4,右邊沒有,但是左邊區間有乙個8,比7大!
快速排序 三個注意點
o n logn 的快排,交換啊a i 和a j 之前,一定要保證i每次遞迴都要保證l includeusing namespace std int a 100 int n 三個注意點,每個都必須要寫對,否則就報錯,一定要保證l a p j i while a i a p i 這裡保證iif i s...
Java 氣泡排序與快速排序的實現
1 基於交換思想的排序演算法 2 從一端開始,逐個比較相鄰的兩個元素,發現倒序即交換。3 一次遍歷,一定能將其中最大 小 的元素交換到其最終位置上 static void bubble sort intarray system.out.print 第 i 1 次排序的結果 for int c 0 c...
點集排序(快速排序)
點集排序演算法,首先是要定義單個點如何確定大小,它不像數字那樣是一維的,點是乙個二維,所以在定義點的時候要定義點如何比較大小。點的大小一般來說,都是從左到右,從下到上的乙個順序,也就是說首先比較x方向,然後再比較y方向。下面是我自己定義的乙個點的類 class doxpoint2d 介面 快速排序 ...