2009年9月13日 星期日

quick sort

自己嚐試寫一下 quick sort,終於完成了,耶!。
花了不少的時間在debug,覺得很有成就感,也發現書上的範列寫的有問題,
沒有顧慮到一下特殊狀況,只有二個且是不用再排序的數列。

學演算法,真的動手寫,然後執行看看,才會發現結果與當初想的不一樣,
一邊分析問題,一邊DEbug,腦中想著"怎麼會這樣?", 終於找到原因,真是非常Happy.
#include"stdio.h"
#include
#define DEBUG 0
#define MAX 7
#include

void
QuickSort(
int *SortArray,
int LeftPosition,
int RightPosition
);
void
SwapInt
(
int *A,
int *B
);

int main(void){

int DataArray[MAX] ;
int i;


printf("before sort complete!\n");

srand(time(NULL));
for(i = 0; i < sizeof(DataArray)/sizeof(int); i++){
DataArray[i] = rand()% 100;
printf("DatatArray[%d] = %d \n",i,DataArray[i]);
}

QuickSort( DataArray,0,( sizeof(DataArray)/sizeof(int) )-1 );

printf("after sort complete!\n");

for(i = 0; i < sizeof(DataArray)/sizeof(int); i++){
printf("DatatArray[%d] = %d \n",i,DataArray[i]);
}
system("Pause");

return true;
}

void
QuickSort(
int *SortArray,
int LeftLimit,
int RightLimit
)
/*

*/
{
int CurtRight;
int CurtLeft;

//
// set the leftest as the pivot
//

if(LeftLimit < RightLimit){
CurtLeft = LeftLimit+1;
CurtRight = RightLimit;
do{
//
//find greater than pivot from left
//
while(CurtLeft < RightLimit && ( SortArray[CurtLeft] <= SortArray[LeftLimit] ) ){
CurtLeft++;
}//end for
//
//find smaller than SortArray[LeftLimit] or equal to it from right
//
while(CurtRight > LeftLimit && ( SortArray[CurtRight] > SortArray[LeftLimit] ) ){
CurtRight--;
}
//
//swap
//
#if DEBUG
printf("CurtLeft = %d ,SortArray[CurtLeft] = %d,CurtRight = %d ,SortArray[CurtRight] = %d\n"
,CurtLeft,SortArray[CurtLeft],CurtRight,SortArray[CurtRight]);
system("PAUSE");
#endif
if(CurtLeft < CurtRight){
SwapInt(&SortArray[CurtRight],&SortArray[CurtLeft]);
}

}while(CurtLeft < CurtRight);
//
// it means that SortArray[CurtRight] <= SortArray[Pivot] value
//
//swap it
//
SwapInt(&SortArray[CurtRight],&SortArray[LeftLimit]);
//
// see the CurtRight position as the middle position
// devide it into the two group and recursive it
//
//
#if DEBUG
int i;
printf("before sort complete!\n");
for(i = 0; i < MAX; i++){
printf("SortArray[%d] = %d \n",i,SortArray[i]);
}
system("Pause");
#endif
QuickSort(SortArray,LeftLimit,CurtRight-1);
QuickSort(SortArray,CurtRight+1,RightLimit);
}//end if(LeftLimit < RightLimit)


}

void
SwapInt
(
int *A,
int *B
)
{
int T;

T = *A;
*A = *B;
*B = T;


}