冒泡排序梳理

概念

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

冒泡由来

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

算法稳定性

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。 [1] 【百度知道】

粗析

比较两个相邻的元素,将值大的元素交换到右边
如果遇到相等的值不进行交换,那这种排序方式是稳定的排序方式。

思想

依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。

N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数

第一趟比较

(1)首先比较第一和第二个数,将小数放在前面,将大数放在后面。

(2)比较第2(此时第二个数就是上一次比较的第一个数)和第3个数,将小数 放在前面,大数放在后面。 如下图。

(3)如此继续,直到比较到最后的两个数,将小数放在前面,大数放在后面,
在这里插入图片描述

第n趟

(4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。重复上述步骤,继续进行比较。

(5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。

(6)依次类推,每一趟比较次数减少依次,直至没有数字比较即比较完成。

实例

对数组 ar[ ] = { 4, 700, 9, 2, 0, 1, 5, 12, 42, 21, 67, 54, 100 };内数字进行排序

//自定义的打印函数,为使结果可观
void PrintArray(int ar[],int n)
{
	for (int i = 0; i < n; ++i)
	{
		printf("%d  ",ar[i]);
	}
	printf("\n");
}
//对数组进行排序
void Sort(int ar[], int n)
{
	for (int i = 0; i < n; ++i)       //用于控制比较的趟数
	{
		for (int j = 0; j < n - i - 1; ++j)     //用于控制每一趟的比较
		{                                       // j<n-i-1解释,当i=0时,j<n-1(第一次要比n-1次)
			if (ar[j]>ar[j + 1])
			{ 
				//交换两个数
				int tmp = ar[j];
				ar[j] = ar[j + 1];              
				ar[j + 1] = tmp;                
			}
		}
	}
}

void main()
{
	int ar[] = { 4, 700, 9, 2, 0, 1, 5, 12, 42, 21, 67, 54, 100 };
	int n = sizeof(ar) / sizeof(ar[0]);
	PrintArray(ar, n);
	Sort(ar, n);                       //排序之前排序之后两次打印
	PrintArray(ar, n);
}

运行结果如下:
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页