?? quicksorter.h
字號:
//快速排序類
#include "Sorter.h"
template <class Record,class Compare>
class QuickSorter:public Sorter<Record,Compare>
{
private:
int SelectPivot(int left, int right);//選擇軸值,返回軸值下標
int Partition(Record Array[], int left, int right); //分割,返回軸值位置
public:
void Sort(Record Array[],int left,int right);
};
//快速排序,Array[]為待排序數組,i,j分別為數組兩端
template <class Record,class Compare>
void QuickSorter<Record,Compare>::Sort(Record Array[], int left,int right)
{
// 如果子序列中包含0或1個記錄,就不用排序
if (right <= left)
return;
//選擇軸值
int pivot = SelectPivot(left, right);
// 將軸值放在數組末端
swap(Array, pivot, right);
// 對剩余的記錄進行分割,分割后軸值已到達正確位置
pivot = Partition(Array, left, right);
//對分割出的子序列進行遞歸快速排序
Sort(Array, left, pivot-1); //對軸值左邊的子序列進行遞歸快速排序
Sort(Array, pivot+1, right); //對軸值右邊的子序列進行遞歸快速排序
}
//選擇軸值
template <class Record,class Compare>
int QuickSorter<Record,Compare>::SelectPivot(int left,int right)
{ //參數left,right分別表示序列的左右端下標
//選擇中間紀錄作為軸值
return (left+right)/2;
}
//分割
template <class Record,class Compare>
int QuickSorter<Record,Compare>::Partition(Record Array[], int left,int right)
{
Record TempRecord; //存放軸值的臨時變量
int i = left; // i為左指針,j為右指針
int j = right;
TempRecord = Array[j]; //將軸值存放在臨時變量中
while (i != j) { //開始進行分割,i,j開始向中間移動,直到相遇
//i指針向右移動,直到找到一個大于等于軸值的記錄
while (Compare::lt(Array[i], TempRecord) && (j>i))
i++;
// 如果i,j尚未相遇,就將逆序元素換到右邊的空閑位置
if (i<j)
{
Array[j] = Array[i];
j--; //j指針向左移動一步
}
// j指針向左移動,直到找到一個小于等于軸值的記錄
while (Compare::gt(Array[j], TempRecord) && (j > i)) j--;
//如果i,j尚未相遇,就將逆序元素換到左邊的空閑位置
if (i<j)
{
Array[i] = Array[j];
i++; //i指針向右移動一步
}
} //end while
Array[i] = TempRecord; //把軸值回填到分界位置i上
return i; //返回分界位置i
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -