排序 快速排序及其優化

2021-10-05 03:26:21 字數 3027 閱讀 7372

在排序中交換數字,達到排序的目的

由於**是c語言寫的,所以需要給出交換函式(如果是c++,那麼就直接用交換函式)

void

swap

(int

*left,

int* right)

先標記基準值(這裡先取最後乙個元素為基準值,記錄起來),之後定義兩個指標,然後前後遍歷,找到比基準值大的或者小的的元素的位置,然後進行標記,標記成功後進行交換,最後新增乙個迴圈,此時的begin和end是在乙個位置的,你要將begin和right-1(其實就是基準值的位置)位置的元素交換(將基準值放到中間,保證前面的數字小於基準值,後面的元素大於基準值

int

partion1

(int

* array,

int left,

int right)

//這裡將基準值和begin(end)交換

if(begin != right -1)

swap

(&array[begin]

,&array[right -1]

);return begin;

//此時應該返回begin,key只是值(這裡是下標操作)

}

這種還是先標記基準值,依舊是begin和end兩個指標,然後begin先找比基準值大的元素,將其填寫到right-1的位置上,此時的begin的位置就是乙個坑,然後end從後開始遍歷,找到比基準值小的元素將其填寫到begin的位置,end的位置就是乙個坑,迴圈以上操作,結束後就將標記起來的基準值填寫到begin(end)的位置。

int

partion2

(int

* array,

int left,

int right)

//從尾開始大於key的值得位置

while

(begin < end && array[end]

>= key)

end--

;//填坑在begin的位置

if(begin < end)

}//將基準值填寫到begin的位置(此時的begin和end的位置是一樣的)

array[begin]

= key;

return begin;

}

先找基準值,然後cur標記left,prev標記cur-1,然後cur遍歷,分為兩個階段:第乙個是cur沒找到比基準值大的,prev和cur一直緊挨著。第二種是找到了,然後cur++,繼續遍歷,找到比基準值小的,然後才讓++prev,此時交換prev和cur位置的元素,cur繼續遍歷,迴圈結束,最後right-1和++prev位置交換,放好基準值的位置。

int

partion3

(int

* array,

int left,

int right)if(

++prev !=

(right -1)

)swap

(&array[prev]

,&array[right -1]

);return prev;

}

呼叫上面寫的三種任何一種方式都可。

不管上面哪種排序,每次交換完成一次之後,都需要對基準值進行交換。

void

quicksort

(int

* array,

int left,

int right)

}

這個不用多說。

void

print

(int

* array,

int size)

printf

("\n");

}

測試用例,可以多寫一點。

#include

"quicksort.h"

intmain()

;print

(array,

sizeof

(array)

/sizeof

(array[0]

));quicksort

(array,0,

sizeof

(array)

/sizeof

(array[0]

));print

(array,

sizeof

(array)

/sizeof

(array[0]

));return0;

}

在進行三種排序的時候我們會發現乙個事情,萬一最右邊的數字是最大或者最小該怎麼辦呢?

此時我們就要對取基準值進行優化,保證不至於偏差非常大

//三值取中法

intgetindexofmid

(int

* array,

int left,

int right)

else

}

記住:三值取中法返回的是下標

因為每次取的值不一定是最佳的,所以這裡我們採用三個位置的值,選擇乙個最佳的位置。

int ret =

getindexofmid

(array, left, right)

;int key = array[ret]

;//基準值

//將那個放到最後面,就可以和之前的**連線起來

swap

(&array[ret]

,&array[right -1]

);

快速排序及其優化

include include 呼叫c 自帶sort include include include using namespace std define max 1000000 define k 12 ifdef debug define new new normal block,file lin...

快速排序及其優化

快速排序是比較經典 常用的演算法,下面簡要介紹其思路。對於乙個陣列,選取某個元素作為切分元素 比如第乙個元素 然後把比這個元素小的都放到它前面,比這個元素大的都放到它後面,這樣切分元素的最終位置就確定了,並且陣列被劃分為兩個子陣列。然後再用同樣的方法分別對子陣列進行排序,最終整個陣列將變成有序的。這...

快速排序及其優化

package com.zc.algorithm public class quicksort 如果不大於,則把右邊的數賦值給左邊 arr left arr right 如果左邊的數小於基數,則向右移動 while left arr right 把最大值放在陣列的末尾 if arr mid arr ...