快速排序是 C.R.A.Hoare 於 1962 年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其爲分治法(Divide-and-ConquerMethod)。
一、快速排序
1.1 分治法基本思想
1.先從數列中取出一個數作爲基準數(樞軸)。2.分區過程將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。(升序)
3.再對左右區間重複第二步,直到各區間只有一個數。
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 +------------------------------------------------------------------+