交换排序的基本思想:两两比较排序记录关键字,一旦发现两个记录不满足次序要求时进行交换,直到整个序列全部满足要求为止。
1.冒泡排序
void BubbleSort(SqList &L)
{
m=L.length -1; flag = 1;//flag用来标记某一趟排序是否发生交换
while((m>0)&&(flag == 1))
{
flag = 0;//flag置为0,如果本趟排序没有发生交换,则不会执行下一趟排序
for(j=1;j<m;j++)
if(L.r[j].key > L.r[j+1].key)
{
flag = 1;//flag置为1表示本趟排序发生了变换
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]进行一趟排序,返回枢纽位置
L.r[o] = L.r[low];//用子表的第一个记录做枢纽记录
pivotkey = L.r[low].key;//枢纽记录关键字保存在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)
{//调用前置初值:low=1,high = L.length
//对顺序表L中的子序列L.r[low..high]进行排序
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);
}