這是最初版本的和隨機版本的結合,我也修改了一下最初版本的小點東西,思路還是最初版的思路,只是我把分割符中的數據排好了而已。呵呵。。也沒有什么號說的。奉上源代碼:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//化分區間,找到最后元素的排序位置。并返回分隔的點(即最后一數據排序的位置)。
//劃分的區間是[nBegin, nEnd). pData是保存數據的指針
int Partition(int* pData, int nBeging, int nEnd)


{
int i = nBeging + rand()%(nBeging - nEnd);
//這里是和hoare的思路寫的,和原版本不是完全一樣,思路是一樣的。
int x = pData[i];
pData[i] = pData[nBeging];
pData[nBeging] = x;
//int x = pData[nBeging];
--nEnd;

while (nBeging < nEnd)

{
//從后向前,找到比X小的元素位置
while(pData[nEnd] > x)

{
--nEnd;
}
//把x小的元素位置提前,nBegin處剛好能保存比x小的元素
if (nBeging < nEnd)

{
pData[nBeging] = pData[nEnd];
pData[nEnd] = x; //這里是為了做一個哨兵,防止小區域增加時越界。
++nBeging;
}

//小的區域增加,找到一個不比x小的元素。
while (pData[nBeging] < x)

{
++nBeging;
}

//把不比x小的元素存放在大的區域內。nEnd剛好預留了此位置。
if (nBeging < nEnd)

{
pData[nEnd] = pData[nBeging];
--nEnd;
}
}

pData[nBeging] = x; //這里一定要賦值,不然如果是nEnd退出循環,他是保存著以前的大值,會出錯。
return nBeging; //返回nD的位置,就是分割的位置。
}

//排序的遞歸調用。
int QuickSortRecursion(int* pData, int nBeging, int nEnd)


{
if (nBeging >= nEnd -1) //如果區域不存在或只有一個數據則不遞歸排序

{
return 1;
}

//這里因為分割的時候,分割點處的數據就是排序中他的位置。
//也就是說他的左邊的數據都小于等于他,他右邊的數據都大于他。
//所以他不在遞歸調用的數據中。
int i = Partition(pData, nBeging, nEnd); //找到分割點

QuickSortRecursion(pData, nBeging, i); //遞歸左邊的排序
QuickSortRecursion(pData, i + 1, nEnd); //遞歸右邊的排序
return 1;
}

//快速排序
int QuickSort(int* pData, int nLen)


{
srand((unsigned int)time(NULL));
//遞歸調用,快速排序。
QuickSortRecursion(pData, 0, nLen);
return 1;
}
int main()


{

int nData[10] =
{2,6,3,4,1,5,7,8,10,9}; //測試數據
QuickSort(nData, 10);
for (int i = 0; i < 10; ++i)

{
printf("%d ", nData[i]);
}
printf("\n");
system("pause");
return 0;
}