交換排序的基本思想:兩兩比較排序記錄關(guān)鍵字,一旦發(fā)現(xiàn)兩個記錄不滿足次序要求時進(jìn)行交換,直到整個序列全部滿足要求為止。
1.冒泡排序

void BubbleSort(SqList &L)
{
m=L.length -1; flag = 1;//flag用來標(biāo)記某一趟排序是否發(fā)生交換
while((m>0)&&(flag == 1))
{
flag = 0;//flag置為0,如果本趟排序沒有發(fā)生交換,則不會執(zhí)行下一趟排序
for(j=1;j<m;j++)
if(L.r[j].key > L.r[j+1].key)
{
flag = 1;//flag置為1表示本趟排序發(fā)生了變換
t= L.r[j];L.r[j] = L.r[j+1];L.r[j+1] = t;//交換前后兩個記錄
}
--m;
}
}

2. 快速排序


int Partition(SqList &L,int low,int high)
{//對順序表中子表r[low..high]進(jìn)行一趟排序,返回樞紐位置
L.r[o] = L.r[low];//用子表的第一個記錄做樞紐記錄
pivotkey = L.r[low].key;//樞紐記錄關(guān)鍵字保存在pivotkey中
while(low<high)//從表的兩端交替地向中間掃描
{
while(low<high&&L.r[high].key>= pivotkey) --high;
L.r[low] = L.r[high];//將比樞紐小的記錄移到低端
while(low<high&&L.r[row].key<= pivotkey) ++low;
L.r[high] = L.r[low];//將比樞紐大的記錄移到高端
}
L.r[low] = L.r[0];//樞紐記錄到位
return low;//返回樞紐記錄
}
void QSort(SqList &L,int low,int high)
{//調(diào)用前置初值:low=1,high = L.length
//對順序表L中的子序列L.r[low..high]進(jìn)行排序
if(low<high)
{
pivotloc = Partition(L,low,high);
QSort(L,low,pivotloc-1);//對左子表遞歸排序
QSort(L,pivotloc+1,high);//對右子表遞歸排序
}
}
void QuickSort(SqList &L)
{
QSort(L,1,L.length);
}

