思路:
- 对n个记录的排序处理最多需要n-1次起泡过程。
- 一次起泡过程的处理结果就是将排序码最大(非递减序)或最小(非递增序)的那个记录交换到最后一个记录位置,到达这个记录在最后排序后的正确位置,然后重复上述起泡过程,但每次只对前面的未排好序的记录进行处理,直到所有的记录都排好序为止。
--------参考文献 熊岳山,祝恩.数据结构与算法[M].北京:清华大学出版社,2013:108.
#include<stdio.h> #include<stdlib.h> #include<assert.h> #define MaxSize 100 typedef int ElemType; typedef struct forSort { ElemType key; //关键字 }ForSort; typedef ForSort* pAr; //pAr-指向节点类型 int ReadTxtToArry(pAr par) { assert(par != NULL); int i = 0; FILE *fp; errno_t err = fopen_s(&fp, "sort.txt", "r"); if (err != 0) exit(1); while (!feof(fp)) { fscanf_s(fp, "%d", &par[i++].key); } return i; } /***************************************************************** *函数名:BubbleSort *函数功能描述:将待排序文件中的记录按照非递减的次序排列成有序序列 *函数参数:par-数组指针 n-数组元素个数 *函数返回值:无返回值 *作者:王赋睿小胖子 *函数创建日期:2018.6.17 *函数修改日期:尚未修改 *修改人:尚未修改 *修改原因:尚未修改 *版本:1.0 *历史版本:无 *****************************************************************/ void BubbleSort(pAr par, int n) { assert(par != NULL); assert(n > 0); int i, j; bool tag=true; //用来标示每次气泡过程中是否进行过记录交换,未进行,达到了排序要求 ForSort temp; /*对n个记录的排序处理最多需要n-1次起泡过程*/ for (i = n-1; tag&&i > 0; --i) { tag = false; for (j = 0; j < i; ++j) { if (par[j + 1].key < par[j].key) { tag = true; temp = par[j + 1]; par[j + 1] = par[j]; par[j] = temp; } } } } void Print(pAr par, int n) { assert(par != NULL); assert(n > 0); for (int i = 0; i < n; ++i) { printf("%-4d", par[i].key); } printf("\n"); } int main() { ForSort ar[MaxSize]; int n = ReadTxtToArry(ar); printf("冒泡排序前:\n"); Print(ar, n); BubbleSort(ar, n); printf("冒泡排序后:\n"); Print(ar, n); return 0; }
本程序在VS2017下运行通过