快速排序
設(shè)要排序的數(shù)組是A[0]……A[N-1],首先任意選取一個數(shù)據(jù)(通常選用數(shù)組的第一個數(shù))作為關(guān)鍵數(shù)據(jù),然后將所有比它小的數(shù)都放到它前面,所有比它大的數(shù)都放到它后面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩(wěn)定的排序算法,也就是說,多個相同的值的相對位置也許會在算法結(jié)束時產(chǎn)生變動。
?一趟快速排序的算法是:
1)設(shè)置兩個變量i、j,排序開始的時候:i=0,j=N-1;
2)以第一個數(shù)組元素作為關(guān)鍵數(shù)據(jù),賦值給key,即key=A[0];
3)從j開始向前搜索,即由后開始向前搜索(j--),找到第一個小于key的值A(chǔ)[j],將A[j]和A[i]互換;
4)從i開始向后搜索,即由前開始向后搜索(i++),找到第一個大于key的A[i],將A[i]和A[j]互換;
5)重復(fù)第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小于key,4中A[i]不大于key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進(jìn)行交換的時候i, j指針位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令循環(huán)結(jié)束)。
void quickSort(int count, int array[])
{
//退出遞歸
if (count < 2) {
//出口
return;
}int start = 0;
int end = count - 1;
int temp = array[start];
while (start < end) {
while (start < end && array[end] > temp) {
end --;
}if (start < end) {
array[start] = array[end];
start ++;
}while (start < end && array[start] < temp) {
start ++;
}if (start < end) {
array[end] = array[start];
end --;
}}array[start] = temp;
quickSort(start, array);
quickSort(count - start - 1, array + start + 1);
}
主函數(shù)調(diào)用
int array[] = {3,7,5,2,9,4,1,8,6};
int count = sizeof(array) / sizeof(array[0]);
//快排
quickSort(sizeof(array) / sizeof(array[0]) , array);
for (int i = 0; i < count;? i ++) {
printf("%d",array[i]);
}