冒泡排序

来源:互联网 发布:linux开放tcp端口 编辑:程序博客网 时间:2024/05/17 04:25

printf("冒泡");



/************************************
文件名        : InsertSort&&BubbleSort.c
描述          : 插入排序之直接插入排序、
                交换排序之起泡排序、
                简单选择排序。
参考自        : 严蔚民
最后修改日期  : 2007-06-18
备注          : 参考自 严蔚民,DEV-C++
                编译通过。
C:/Documents and Settings/程序运行范例>
请输入记录数(小于21):8
请输入各纪录的关键字项和数据项>>>>
L.r[ 1].key  L.r[ 1].info:49 mm
L.r[ 2].key  L.r[ 2].info:38 mm
L.r[ 3].key  L.r[ 3].info:65 mm
L.r[ 4].key  L.r[ 4].info:97 mm
L.r[ 5].key  L.r[ 5].info:76 mm
L.r[ 6].key  L.r[ 6].info:13 mm
L.r[ 7].key  L.r[ 7].info:27 mm
L.r[ 8].key  L.r[ 8].info:49 gg

选择:
1直接插入排序
2起泡排序
3简单选择排序
2

起泡排序...结果:
L.r[ 1].key=13   L.r[ 1].info=mm
L.r[ 2].key=27   L.r[ 2].info=mm
L.r[ 3].key=38   L.r[ 3].info=mm
L.r[ 4].key=49   L.r[ 4].info=mm
L.r[ 5].key=49   L.r[ 5].info=gg
L.r[ 6].key=65   L.r[ 6].info=mm
L.r[ 7].key=76   L.r[ 7].info=mm
L.r[ 8].key=97   L.r[ 8].info=mm
请按任意键继续. . .
*************************************/
#include <stdio.h>
#define   MAXSIZE   20   /*一个用作事例的小顺序表的最大长度*/
typedef   struct{  
    int key;             /*关键字项 */
    char info[99];       /*其他数据项 */
}RedType;                /*纪录类型 */
typedef   struct{
    RedType r[MAXSIZE+1];/*r[0]闲置或用作哨兵单元 */
    int length;          /*顺序表长度 */
}SqList;                 /*顺序表类型 */

void InsertSort(SqList *L){
    int i,j;
    for(i=2;i<=L->length;i++)
        if(L->r[i].key<L->r[i-1].key){/*若小,将r[i]插入有序子表*/
            L->r[0]=L->r[i];/*复制为哨兵 */
            L->r[i]=L->r[i-1];
            for(j=i-2;L->r[0].key<L->r[j].key;j--)
                L->r[j+1]=L->r[j];/*纪录后移*/
            L->r[j+1]=L->r[0];/*插入到正确的位置 */
        }
}

void BubbleSort(SqList *L){
    int i,j,tag;
    for(i=1,tag=1; tag==1 && i<L->length; i++)
        tap=0;
        for(j=L->length-1;j>=i;j--)
            if(L->r[j+1].key<L->r[j].key){/*交换 */
                L->r[0]=L->r[j+1];/*L->r[0]当作temp */
                L->r[j+1]=L->r[j];
                L->r[j]=L->r[0];
                tag=1;
            }
}

void SelectSort(SqList *L){
    int i,j,min;
    for(i=1;i<L->length;i++){/*选择第i小的纪录 */
        for(j=i+1,min=i;j<=L->length;j++)/*选择key最小的纪录 */
            if(L->r[j].key<L->r[min].key)
                min=j;
        if(i!=min){/*于第i个纪录交换 */
            L->r[0]=L->r[i];
            L->r[i]=L->r[min];
            L->r[min]=L->r[0];
        }
    }
}

int main()
{
    SqList L;
    int k;
    printf("请输入记录数(小于%d):",MAXSIZE+1);
    scanf("%d",&L.length);
    printf("请输入各纪录的关键字项和数据项>>>>/n");
    for(k=1;k<=L.length;k++){
        printf("L.r[%2d].key  L.r[%2d].info:",k,k);
        scanf("%d%s",&L.r[k].key,L.r[k].info);
    }
    printf("/n选择:/n1直接插入排序/n2起泡排序/n3简单选择排序/n");
    scanf("%d",&k);
    if(k==1) {InsertSort(&L); printf("/n直接插入排序...结果:/n");}
    else if(k==2) {BubbleSort(&L);printf("/n起泡排序...结果:/n");}
    else {SelectSort(&L);printf("/n简单选择排序...结果:/n");}
    for(k=1;k<=L.length;k++)
        printf("L.r[%2d].key=%-4d L.r[%2d].info=%s/n",k,L.r[k].key,k,L.r[k].info);
    system("pause");
}