快速排序由C. A. R. Hoare在1962年提出。
它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用數組的第一個數)作為關鍵數據,然后將所有比它小的數都放到它前面,所有比它大的數都放到它后面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序算法,也就是說,多個相同的值的相對位置也許會在算法結束時產生變動。
快速排序算法圖
一趟快速排序的算法是:
1)設置兩個變量i、j,排序開始的時候:i=0,j=N-1;
2)以第一個數組元素作為關鍵數據,賦值給key,即key=A[0];
3)從j開始向前搜索,即由后開始向前搜索(j--),找到第一個小于key的值A[j],將A[j]和A[i]互換;
4)從i開始向后搜索,即由前開始向后搜索(i++),找到第一個大于key的A[i],將A[i]和A[j]互換;
5)重復第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小于key,4中A[i]不大于key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指針位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令循環結束)。
示例代碼:
- (void)paixu:(NSMutableArray *)arr left:(int)left right:(int)right
{
if(left >= right)/*如果左邊索引大于或者等于右邊的索引就代表已經整理完成一個組了*/
{
return ;
}
int i = left;
int j = right;
int key = [arr[left] intValue];
while(i < j) /*控制在當組內尋找一遍*/
{
while(i < j && key <= [arr[j] intValue])
/*而尋找結束的條件就是,1,找到一個小于或者大于key的數(大于或小于取決于你想升
序還是降序)2,沒有符合條件1的,并且i與j的大小沒有反轉*/
{
j--;/*向前尋找*/
}
arr[i] = @([arr[j] intValue]);
/*找到一個這樣的數后就把它賦給前面的被拿走的i的值(如果第一次循環且key是
a[left],那么就是給key)*/
NSLog(@"11111%@",arr);
while(i < j && key >= [arr[i] intValue])
/*這是i在當組內向前尋找,同上,不過注意與key的大小關系停止循環和上面相反,
因為排序思想是把數往兩邊扔,所以左右兩邊的數大小與key的關系相反*/
{
i++;
}
arr[j] = arr[i];
NSLog(@"22222%@",arr);
}
arr[i] = @(key);/*當在當組內找完一遍以后就把中間數key回歸*/
NSLog(@"---------------");
// sort(arr, left, i - 1);/*最后用同樣的方式對分出來的左邊的小組進行同上的做法*/
[self paixu:arr left:left right:i-1];
// sort(arr, i + 1, right);/*用同樣的方式對分出來的右邊的小組進行同上的做法*/
[self paixu:arr left:i+1 right:right];
/*當然最后可能會出現很多分左右,直到每一組的i = j 為止*/
}