数据结构与算法 (二) 冒泡排序

1.算法思想:

      每次将待排序文件中的两个记录的排序码进行比较,如果不满足要求,则交换着两个记录在文件中的顺序,直到文件中任意两个记录之间都满足排序要求为止 (冒泡排序和快速排序都属于交换排序

2.算法过程:

        首先比较第1个记录和第2个记录的排序码,如果不满足排序要求,则交换第1个记录和第2个记录的位置;然后对第2个记录(可能是新交换过来的最初的第1个记录)和第三个记录进行同样的处理,重复此过程,直到处理完第n-1个记录和第n个记录为止,以上为一次起泡过程,处理的结果就是把排序码最小或者最大的那个记录交换到最后一个记录的位置,到达这个记录在最后排序后的正确位置,然后重复上述起泡过程,但每次只对前面的未排序好的记录进行处理,直到所有记录排序好为止。

      在每次起泡过程中设置一个标志位,用以标注每次起泡过程中是否进行过记录交换,如果某次起泡过程中未发生交换则表明整个过程记录已经达到了排序的要求 ,显然对n个记录的排序处理最多为n-1次

2.算法实现

#include <stdio.h>
#include <stdlib.h>

enum boolean {FALSE,TRUE};
typedef enum boolean Bool;

#define TRUE 1
#define FALSE 0

#define Bool int

typedef int ElementType;

struct forSort
{
    ElementType key;
};

typedef struct forSort ForSort;

void InitForSort(ForSort *FS,int a)
{
    FS->key=a;
}

void BubbleSort(ForSort A[],int n)
{
    int i,j;
    Bool flag;
    //此处结构体 声明变量 A[] 为 ForSort 所以下边使用temp 直接可以赋值
    ForSort temp;

    //查询初始位置为 N-1 所以用 i--
    for(i=n-1; flag=(Bool)1, i>0&&flag; i--)
    {
        //从第0个开始比较 每次比较都少一位置 (向前推进一位)
        for(j=0; j<i; j++)
        {
            if(A[j+1].key<A[j].key)
            {
                flag=TRUE;
                temp=A[j+1];
                A[j+1]=A[j];
                A[j]=temp;
            }
        }
    }
}


int main()
{
    int i;
    int A[8]={28,13,72,85,39,41,6,20};

    BubbleSort(A,8);

    for(i=0;i<8;i++){
        printf("%d\n",A[i]);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43870026/article/details/85209559