冒泡排序
第n个数据和第n+1个数据比较,大的往后交换,一趟下来,最大的换到最后面。重复上述过程,直至没有数据需要交换,则排序结束。
样例解释
快速排序
分区
//不断与枢轴交换
int Partition(SqList &L,int low,int high){
pivotkey=L.r[low];//用子表的第一个记录做枢轴记录
while(low<high){
while(low<high&&L.r[high]>=pivotkey)
--high;
change(L.r[low],L.r[high]);//小的交换到左面
while(low<high&&L.r[high]<=pivotkey)
++low;
change(L.r[low],L.r[high]);//大的交换至右边
}
return low; //返回枢轴位置
}
//将枢轴暂存r[0],交换low和high
int Partition(SqList &L,int low,int high){
L.r[0]=L.r[low];
pivotkey=L.r[low];
while(low<high){
while(low<high&&L.r[high]>=pivotkey)
--high;
L.r[low]=L.r[high];//小的交换到左面
while(low<high&&L.r[high]<=pivotkey)
++low;
L.r[high]=L.r[low];//大的交换至右边
}
L.r[low]=L.r[0];
return low;
}
排序
void QSort(SqList &L,int low,int high){
//对顺序表中的子表做快速排序(递归)
if(low<high){
pivotkey=Partition(L,low,high);
QSort(L,low,pivotkey-1);
QSort(L,pivotkey+1,high);
}
}
选择排序
简单选择排序
//简单选择排序
viod SelectSort(SqList &L){
for(i=1,i<L.length;++i){
k=i;
for(j=i+1;j<=L.lengh;j++){
if(L.r[j]<L.r[k]){
k=j;
}
}
if(i!=k){
change(L.r[k],L.r[i]);
}
}
}
堆排序
在输出堆顶元素之后,如何调整剩余元素成为一个新的堆?
void HeapAdjust (SqList &H, int s, int m){
rc=H.r[s];
for(j=2*s;j<=m;j*=2){
if(j<m&&H.r[j].key<H.r[j+1].key)
++j;
if (H.r[0].key>=H.r[j].key) break;
H.r[s] = H.r[j]; s = j;
}
H.r[s]=rc=;
}
如何将一个无序序列建成大顶堆?
void HeapSort ( HeapType &H ) {
for ( i=H.length/2;i>0;--i )
HeapAdjust ( H.r, i, H.length );
//建大顶堆
for ( i=H.length;i>1;--i) {
H.r[1]←→H.r[i];
HeapAdjust(H.r, 1, i-1);
}
}