/*对顺序表L作冒泡排序*/voidBubbleSort(SqList *L){int i, j;for(i =1; i < L->length; i++){for(j = L->length -1; j--)/*注意j是从后往前循环*/{if(L->r[j]> L->r[j+1])/*若前者大于后者*/{swap(L, j, j+1);/*交换L->r[j]与L->r[j+1]的值*/}}}}/*对顺序表L作改进冒泡排序*/voidBubbleSort2(SqList *L){int i, j;
Status flag = TRUE;/*flag用来作为标记*/for(i =1; i < L->length && flag; i++)/*若flag为false则退出循环*/{
flag = FALSE;/*初始化为false*/for(j = L->length -1; j >= i; j--)/*注意j是从后往前循环*/{if(L->r[j]> L->r[j+1])/*若前者大于后者*/{swap(L, j, j+1);/*交换L->r[j]与L->r[j+1]的值*/
flag = TRUE;/*如果有数据交换,则flag为true*/}}}}
2、简单选择排序
简单选择排序法(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1 <= i <= n)个记录交换之。总的时间复杂度为O(n^2)
/*对顺序表L作简单选择排序*/voidSelectSort(SqList *L){int i, j, min;for(i =1; i < L->length; i++){
min = i;/*将当前下标定义为最小值下标*/for(j = i +1; j < L->length; j++)/*循环之后的数据*/{if(L->r[min]> L->r[j])/*如果有小于当前最小值的关键字,将此关键字的下标赋值给min*/
min = j;}if(i != min)/*若min不等于i,说明找到最小值,交换*/swap(L, i, min);/*交换L->r[i]与L->r[min]的值*/}}
/*对顺序表L作归并排序*/voidMergeSort(SqList *L){MSort(L->r, L->r,1, L->length);}/*将SR[s...t]归并排序为TR1[s...t]*/voidMSort(int SR[],int TR1[],int s,int t){int m;int TR2[MAXSIZE +1];if(s == t)
TR1[s]= SR[s];else{
m =(s + t)/2;/*将SR[s...t]平分为SR[s...m]和SR[m + 1...t]*/MSort(SR, TR2, s, m);/*递归将SR[s...m]归并为有序的TR2[s...m]*/
MSort[SR, TR2, m +1, t);/*递归将SR[m + 1...t]归并为有序TR2[m + 1...t]*/Merge(TR2, TR1, s, m, t);/*将TR2[s...m]和TR2[m + 1...t]归并到TR1[s...t]*/}}/*将有序的SR[i...m]和SR[m + 1...n]归并为有序的TR[i...n]*/void Merge[int SR[],int TR[],int i,int m,int n){int j, k, l;for(j = m +1, k = i; i <= m && j <= n; k++)/*将SR中记录由小到大归并入TR*/{if(SR[i]< SR[j])
TR[k]= SR[i++];else
TR[k]= SR[j++];}if(i <= m){for(l =0; l <= m -1; l++)
TR[k +1]= SR[i +1];/*将剩余的SR[i...m]复制到TR*/}if(j <= n){for(l =0; l <= n - j; l++)
TR[k +1]= SR[j +1];/*将剩余的SR[j...n]复制到TR*/}}
对顺序表L作归并非递归排序:
voidMergeSort2(SqList *L){int*TR =(int*)malloc(L->length *sizeof(int));/*申请额外空间*/int k =1;while(k < L->length){MergePass(L->r, TR, k, L->length);
k =2* k;/*子序列长度加倍*/MergePass(TR, L->r, k, L->length);
k =2* k;/*子序列长度加倍*/}}/*将SR[]中相邻长度为s的子序列两两归并到TR[]*/voidMergePass(int SR[],int TR[],int s,int n){int i =1;int j;while(i <= n -2* s +1){Nerge(SR, TR, i, i + s -1, i +2* s -1);/*两两归并*/
i = i +2* s;}if(i < n - s +1)/*归并最后两个序列*/Merge(SR, TR, i, i + s -1, n);else/*若最后只剩下单个子序列*/for(j = i; j <= n; j++)
TR[j]= SR[j];}