交换排序------冒泡排序

       思路

  • 对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下运行通过

猜你喜欢

转载自blog.csdn.net/qq_41822235/article/details/80720562