快速排序

快速排序由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 為止*/
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 版本記錄 前言 將數據結構和算法比作計算機的基石毫不為過,追求程序的高效是每一個軟件工程師的夢想。下面就是我對算法...
    刀客傳奇閱讀 5,207評論 4 72
  • 快速排序(Quicksort)是對冒泡排序的一種改進。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分...
    笑啥風云閱讀 902評論 0 0
  • quicksort可以說是應用最廣泛的排序算法之一,它的基本思想是分治法,選擇一個pivot(中軸點),將小于pi...
    黎景陽閱讀 471評論 0 1
  • 說來真是可笑,人與人之間的關系有時候一頓飯就能看出來,很重視的一個人初次見面或者好久不見總想吃一頓像樣的飯,氣氛合...
    林雅閱讀 378評論 0 0
  • 前言: 宋小寶問趙本山:師傅,你為什么這么會吹牛?趙本山不說話,把小寶帶到一只牛身后,說:吹。小寶對著牛屁股吹了一...
    小李有飛刀閱讀 165評論 0 2