快速排序

  快速排序是 C.R.A.Hoare 於 1962 年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其爲分治法(Divide-and-ConquerMethod)。

一、快速排序

  1.1 分治法基本思想

  1.先從數列中取出一個數作爲基準數(樞軸)。
  2.分區過程將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。(升序)
  3.再對左右區間重複第二步,直到各區間只有一個數。


創建變量i(left)=0(指向第一個數據), j(right)=9(指向最後一個數據) ,target=9(爲第一個數據的值)。我們要把所有比target小的數移動到target的左面,所以我們可以開始尋找比9小的數,從j開始,從右往左找,不斷遞減變量j的值,我們找到第一個下標9的數據4比9小,於是把數據4移到下標0的位置,把下標0的數據9移到下標9,完成第一次比較。

  1.2 代碼示例

//因爲在左邊挖坑,從右面開始 找比基準數小的
  while (left < right && arr[right] > target)
  {
    right--;
   }
   if (left < right){
       arr[left] = arr[right];
       left++;
   }

控制檯:
+------------------------------------------------------------------+
打印快速排序前的數組:
9 0 2 6 1 7 8 4 3 4 
第1次比較結果:
4 0 2 6 1 7 8 4 3 
+------------------------------------------------------------------+
 第一次比較完後 變量i(left)=1, j=9,target=9,第二輪比較和第一輪相反,我們從左往右尋找比target大的數 每次i++ 結果沒有比target大的。跳出循環且遞歸自己.經過前面2輪比較已經確任9是最大的,這時候可以不用再比較9這個數,將 j--。

//從左向右找比基準數大的
 while (left < right && arr[left] < target){
        left++;
 }

//
//  快速排序.cpp
//  數據結構
//
//  Created by 劉龍玲 
//  Copyright © 2016年 liulongling. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//打印數組
void PrintArray1(int* arr, int length){
    for (int i = 0; i < length; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int i = 1;

void QuickSort(int* arr,int low,int height)
{
    
    int left = low;
    int right = height;
    //取出基準數
    int target = arr[left];
    
    if (left < right){
        while (left < right){
            //因爲在左邊挖坑,從右面開始 找比基準數小的
            while (left < right && arr[right] > target)
            {
                right--;
            }
            if (left < right){
                arr[left] = arr[right];
                left++;
                printf("第%d次比較結果:\n",i++);
                PrintArray1(arr, 9);
            }
            

            //從左向右找比基準數大的
            while (left < right && arr[left] < target){
                left++;
            }
            if (left < right){
                arr[right] = arr[left];
                right--;
                printf("第%d次比較結果:\n",i++);
                PrintArray1(arr, 9);
            }
        }
      
        //這個時候 left 和 right 同時指向的位置,將基準數插入這個位置
        arr[left] = target;
        printf("第%d次比較結果:\n",i++);
        PrintArray1(arr, 9);

        QuickSort(arr, low, left - 1);
        QuickSort(arr, left + 1, height);
    }
}



int main(void)
{
    
    int array[] ={9,0,2,6,1,7,8,4,3,4};
    int length = sizeof(array) / sizeof(int);
    
    printf("打印快速排序前的數組:\n");
    PrintArray1(array, length);
    
    QuickSort(array,0,length-1);
    
    printf("打印快速排序後的數組:\n");
    PrintArray1(array, length);
    return 1;
}
控制檯:
+------------------------------------------------------------------+
打印快速排序前的數組:
9 0 2 6 1 7 8 4 3 4 
第1次比較結果:
4 0 2 6 1 7 8 4 3 
第2次比較結果:
3 0 2 6 1 7 8 4 3 
第3次比較結果:
3 0 2 6 1 7 8 4 6 
第4次比較結果:
3 0 2 4 1 7 8 4 6 
第5次比較結果:
3 0 2 4 1 7 8 7 6 
第6次比較結果:
1 0 2 4 1 4 8 7 6 
第7次比較結果:
1 0 2 4 4 4 8 7 6 
第8次比較結果:
0 0 2 3 4 4 8 7 6 
第9次比較結果:
0 1 2 3 4 4 6 7 6 
打印快速排序後的數組:
0 1 2 3 4 4 6 7 8 9 
+------------------------------------------------------------------+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章