冒泡排序------c语言

  冒泡排序的思路:
   1. 数据两两比较,将较大的数据挪到后面,这样一次循环后就可以确定一个元素的最终位置。
   2. 接着从头开始两两比较,将次大的数据挪到上次已经排序好的数据的前一个位置。
   3. 重复size-1次即可将size-1个元素放到它的最终位置上,这样剩下的那个元素肯定在自己的最终位置上,冒泡排序结束。
在这里插入图片描述
  代码实现:

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

//打印
void Print(int *array,int size);
//冒泡排序
void BubbleSort(int *array, int size);

//打印
void Print(int *array, int size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		printf("%d ", array[i]);
	}
	printf("\n");
}
void swap(int *x, int *y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}
//冒泡排序
void BubbleSort(int *array, int size)
{
	int i = 0;
	int j = 0;
	int k = 1;
	int flag = 0;
	//外循环循环size-1次、
	for (i = 0; i < size - 1; i++)
	{
		flag = 0;
		for (j = 0; j < size - i - 1; j++)
		{
			if (array[j]>array[j + 1])
			{
				flag = 1;
				swap(&array[j], &array[j + 1]);
			}	
		}
		//打印
		printf("第%d次排序后:", k++);
		Print(array, size);
		//flag为0说明没有交换,排序结束
		if (flag == 0)
		{
			break;
		}
	}
}

测试文件:

#include"sort.h"
void TestBubbleSort()
{
	int array[] = { 10, 2, 5, 4, 6, 9, 3, 1, 0 };
	printf("排序前:");
	//打印
	Print(array, sizeof(array) / sizeof(array[0]));
	//冒泡排序
	BubbleSort(array, sizeof(array) / sizeof(array[0]));
	printf("排序后:");
	//打印
	Print(array, sizeof(array) / sizeof(array[0]));
}
int main()
{
	TestBubbleSort();
	system("pause");
	return 0;
}

在这里插入图片描述
  为什么要设置一个变量flag?
  比如序列【0,2,1】,第一次冒泡排序后,序列变为【0,1,2】序列已有序,就不必在进行第二次排序。所以设置一个变量flag,当元素一次冒泡后没有交换数据,就证明该序列已经有序,直接退出即可。
  时间复杂度:
   O(n^2)
  空间复杂度:
   O(1)—(没有借助辅助空间)

猜你喜欢

转载自blog.csdn.net/zhao_miao/article/details/82804559
今日推荐