算法实例:图示冒泡排序算法
美国学者埃德加.戴尔(Edgar Dale)1946年提出了“学习金字塔”的理论。将学习方式分为7种,分别听讲、阅读、视听结合、演示、讨论、实践、分享。前四种属于被动学习,学习内容的平均留存率较低,而后三种属于主动学习,学习内容的平均留存率更高。传统的听讲、阅读学习内容平均留存率只有5%,10%。而通过分享的方式教授给他人,学习的平均留存率可以达到90%。一起学习,共同进步!
老猫coder
不教你做一个古板的程序猿,教你做个有趣的coder。
Official Account
今天来学习算法部分,先从排序算法开始
什么是冒泡排序
相邻位置的元素顺序比较大小,按照排序规则决定是否进行交换。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
图解冒泡排序
通俗化过程:你可以在脑海中想想有这样一串气泡。最底下的位置为0,我们按照从大到小进行排序,大的往下沉,小的往上升,因为这样比较符合物理规律一点。
好,开始,
第一轮:一个12的气泡遇到一个5的气泡,由于5比12小所以不需要交换,然后一个5的气泡看到一个23的气泡。23的气泡太大了,只能往下走,那就是5和23交换位置没然后是5和1比较,1比较小,不需要交换,然后1和43交换,再1和56交换。一轮之后1就到最上面了。这一轮共进行了5次比较
第二轮:接下来,就开始排剩余的5个元素。接下来12和23比较,交换,12再与5比较不交换。5跟43比较交换,5跟56比较交换。经过这一轮5排到了次上面的位置。这一轮共进行了4次比较。
。。。。。。。
以此类推,总共进行了5轮,每轮分别进行了5次,4次,3次,2次,1次比较,为甚么要说这个呢?这就是两层for循环的逻辑所在。
show your code
C语言代码:
void BubbleSort(int a[], int len)
{
int i, j, temp;
for (j = 0; j < len - 1; j++)
{
for (i = 0; i < len - 1 - j; i++)
if (a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
int main()
{
int arr[] = { 12, 5, 23, 1, 43, 56 };
int len = sizeof(arr) / sizeof(arr[0]);
int i = 0;
printf("排序前:");
for (i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
BubbleSort(arr, len);
printf("排序后:");
for (i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}