概念
冒泡排序(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);
}
运行结果如下: