在排序中交換數字,達到排序的目的
由於**是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 ...