最近比较有空,想熟悉一下算法,有一段时间没有写程序了。
基本思想:
在当前无序区Array[1..H]中任取一个数据元素(这里用中间的元素)作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:Array[1..I-1]和Array[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即Array[1..I-1]≤X.Key≤Array[I+1..H](1≤I≤H),当Array[1..I-1]和Array[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。
快速排序实现代码:
template<class T>
void quickSort(T Array[], int nSize)
... {
run(Array, 0, nSize-1);
}
template <class T>
void run(T Array[], int nleft, int nright)
... {
int i = nleft, j = nright;
int mid = (nleft + nright)/2;
T x = Array[mid];
do ...{
while((i < nright) && (Array[i] < x)) i++; //从左到右查找第1个大于等于x的下标
while((j > nleft ) && (Array[j] > x)) j--; //从右到左查找第1个小于等于x的下标
if(i <= j)
...{
swap(Array[i], Array[j]);
i++;
j--;
}
} while(i <= j);
if(j > nleft) //sort Array[nleft...j];
run(Array, nleft, j);
if(i < nright) //sort Array[i...nright];
run(Array, i, nright);
}
void quickSort(T Array[], int nSize)
... {
run(Array, 0, nSize-1);
}
template <class T>
void run(T Array[], int nleft, int nright)
... {
int i = nleft, j = nright;
int mid = (nleft + nright)/2;
T x = Array[mid];
do ...{
while((i < nright) && (Array[i] < x)) i++; //从左到右查找第1个大于等于x的下标
while((j > nleft ) && (Array[j] > x)) j--; //从右到左查找第1个小于等于x的下标
if(i <= j)
...{
swap(Array[i], Array[j]);
i++;
j--;
}
} while(i <= j);
if(j > nleft) //sort Array[nleft...j];
run(Array, nleft, j);
if(i < nright) //sort Array[i...nright];
run(Array, i, nright);
}