大话数据结构C语言64 冒泡排序

Posted 是CodeAllen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大话数据结构C语言64 冒泡排序相关的知识,希望对你有一定的参考价值。

冒泡排序的要点

两两注意是相邻的两个元素的意思

如果有n个元素需要比较n-1次,每一轮减少1次比较

既然叫冒泡排序,那就是从下往上两两比较,所以看上去就跟泡泡往上冒一样。

 

冒泡排序是最简单的一种排序,基本思想就是两两比较相邻的关键字,如果反序则交换,直到没有反序为止

 

冒泡排序的一般思路:

#include <stdio.h>

void BubbleSort(int k[], int n)
{
	int i, j, temp, count1=0, count2=0;
	
	for( i=0; i < n-1; i++ )
	{
		for( j=i+1; j < n; j++ )
		{
			count1++;
			if( k[i] > k[j] )
			{
				count2++;
				temp = k[j];
				k[j] = k[i];
				k[i] = temp;
			}
		}
	}
	printf("总共进行了%d次比较,进行了%d次移动!", count1, count2);
}

int main()
{
	int i, a[10] = {1, 0, 2, 3, 4, 5, 6, 7, 8, 9};

	BubbleSort(a, 10);

	printf("排序后的结果是:");
	for( i=0; i < 10; i++ )
	{
		printf("%d", a[i]);
	}
	printf("\\n\\n");

	return 0;
}

 

 

上述代码严格意义来说不算是标准的冒泡排序算法,因为不满足“两两比较相邻关键字”的思想

更应该是最最简单的交换排序而已,这种排序是比较低效的

 

下边是正宗的冒泡排序:

#include <stdio.h>

void BubbleSort(int k[], int n)
{
	int i, j, temp, count1=0, count2=0;
	
	for( i=0; i < n-1; i++ )
	{
		for( j=n-1; j > i; j-- )
		{
			count1++;
			if( k[j-1] > k[j] )
			{
				count2++;
				temp = k[j-1];
				k[j-1] = k[j];
				k[j] = temp;
			}
		}
	}

	printf("总共进行了%d次比较,进行了%d次移动!", count1, count2);
}

int main()
{
	int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};

	BubbleSort(a, 10);

	printf("排序后的结果是:");
	for( i=0; i < 10; i++ )
	{
		printf("%d", a[i]);
	}
	printf("\\n\\n");

	return 0;
}

 

 

这样的算法是否还可以优化呢?

答案是可以的,可以在代码中增加一个flag标记算法,当知道数据没有任何数据交换的时候,说明此时序列已经有序,不需要在继续后边的循环判断工作

#include <stdio.h>

void BubbleSort(int k[], int n)
{
	int i, j, temp, count1=0, count2=0, flag;
	
	flag = 1;
	for( i=0; i < n-1 && flag; i++ )
	{
		for( j=n-1; j > i; j-- )
		{
			count1++;
			flag = 0;
			if( k[j-1] > k[j] )
			{
				count2++;
				temp = k[j-1];
				k[j-1] = k[j];
				k[j] = temp;
				flag = 1;
			}
		}
	}

	printf("总共进行了%d次比较,进行了%d次移动!", count1, count2);
}

int main()
{
	int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};

	BubbleSort(a, 10);

	printf("排序后的结果是:");
	for( i=0; i < 10; i++ )
	{
		printf("%d", a[i]);
	}
	printf("\\n\\n");

	return 0;
}

 

以上是关于大话数据结构C语言64 冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

大话数据结构C语言70 快速排序

大话数据结构C语言70 快速排序

大话数据结构C语言66 直接插入排序

排序算法c语言描述---双向冒泡排序

大话数据结构----冒泡排序Bubble sort

C语言冒泡排序法代码