一、學習要點:
1.先從數列中選取一個數作爲基準數。
2.利用區分過程,爲這個數確定在排序後數組的位置,區分過程爲,比這個數大的數全放到他的右邊,小於或等於這個數的數放到他的左邊;
3.在對左右區間重複第二步,知道個區間只有一個數。
4.如果這個數組有10個數,第二步將執行十次,每次的複雜度爲logn,總複雜度爲O(nlogn),因爲每執行一次區間排序可爲數組中一個元素確定該元素在排序後的位置;
注:每走一趟的思維(挖坑填數)如下:
1.i=L;j=R;將基準數挖出形成第一個坑a[i].
2.j–由後向前找比他小的數,直到找到比他小,找到後挖出此數填前一個坑a[i]中。
3.i++由前向後找到比它大的數,找到後也挖出此數填到前一個坑a[j]中。
4.在重複執行2、3兩步,直到i==j,將基準數填入a[i]中。
二、實現代碼:
#include<iostream>
using namespace std;
//函數聲明
void quicksort(int a[],int l,int r);
int main(){
return 0;
}
//函數的定義
void quicksort(int a[],int l,int r){
//遞歸體
if(l<r){
int i=l,j=r,x=a[l];
while(i<j){
while(i<j&a[j]>x){
j--;
}
if(i<j){
a[i++]=a[j];
}
while(i<j&a[i]<x){
i++;
}
if(i<j){
a[j--]=a[i]
}
}
a[i]=x;//每次走一趟確定一個;
quicksort(a,l,i-1);
quicksort(a,i+1,r);
}
//遞歸頭
//l=r
}
三、程序運行結果圖:
四、注意事項:
1.每次走完一趟後要確定一個元素在排序後數組中的位置;
2.利用填坑的思維而不是數組元素的交換(在每走一趟的過程中)
喜歡請點贊 謝謝
具體matlab代碼參考:https://download.csdn.net/download/fyf18845165207/10886708