基本概念:
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,
如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。
走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),
就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
算法原理:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。
在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了第一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
示范代码:
#include <stdio.h>
#define SIZE 8
void bubble_sort(int a[], int n);
void bubble_sort(int a[], int n)
{
int i, j, temp;
for (j = 0; j < n - 1; j++)
for (i = 0; i < n - 1 - j; i++)
{
if(a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
int main()
{
int number[SIZE] = {95, 45, 15, 78, 84, 51, 24, 12};
int i;
bubble_sort(number, SIZE);
for (i = 0; i < SIZE; i++)
{
printf("%d\n", number[i]);
}
return 0;
}
另一种可以参考的做法是(在此只给出关键实现部分,其余部分请读者自行实现),另外请注意item类型。
void refore(item *a,int index1,int index2)
{
item temp_data = a[index2];
a[index2] = a[index1];
a[index1] = temp_data;
return;
}
void bsort(item *a,int index_top)
{
int out_count = 0;
while(out_count != (index_top+1)*(index_top+1)){
int this_index = 0;
while(this_index <= index_top){
if(a[this_index] > a[this_index + 1])
refore(a,this_index,this_index + 1);
this_index++;
}
out_count++;
}
}
个人理解与思路:
实现冒泡排序,是需要两个相邻元素进行比较,依次类推往下比较,直到最后一组的相邻两个元素
比较完毕即可。打个比方,现在有4个数字要进行比较,那么我们一次就要进行3轮比较,我们可以
知道这个比较的轮数为数组元素数减去1,即数组元素数(arr)- 1 = 比较的轮数(len)。
也就是我们需要定义一个循环来控制这个比较的轮数。
元素之间的比较是要从下标为0开始的数与下标为1开始的数进行比较的,所以我们需要声明一个变量i,
然后从下标0开始循环比较,依次类推到最后一个元素,这个元素的下标是数组元素个数减1。但是这个
比较循环必须是包含在轮数循环中的,可以说是一个循环之间的嵌套。
然后就是进行比较了,比较第一个和第二个下标处的值的大小,如果1比2大,这里可以声明一个临时
变量,用于储存第一个值,这时第一个值就是NULL空值,然后将第二个下标处的值给第一个下标处,
再把临时存储的变量赋值给第二个下标处。
C代码:
#include <stdlib.h>
/*实现冒泡排序算法的bubble函数*/
/*传递参数arr数组,并传参数组中的元素个数len*/
void bubble(int arr[], int len) {
/*声明变量i和j,首先要使用外层循环控制轮数*/
int i = 0, j = 0;
for (i=1; i < len; i++) {
/*内层循环用于比较下标元素之间的大小*/
for (j=0; j < len - 1; j++) {
/*如果说第一个下标数
比第二个下标数要大*/
if (arr[j] > arr[j+1]) {
int temp = arr[j]; //临时声明一个temp变量来保存j下标处的值
arr[j] = arr[j+1]; //将j+1下标处的值赋给j下标处
arr[j+1] = temp; //然后将temp临时变量储存的值赋给j+1下标处
}
}
}
}
/*主函数*/
int main() {
/*声明数组变量*/
int arr[9] = {20, 33, 67, 91, 1, 59, 42, 25, 28, 96};
/*被调用函数bubble声明*/
bubble(arr, 9);
/*声明一个循环打印的变量*/
int i = 0;
/*用开始从第一个数字打印,因为数组中有10个数,所以i不能大于9*/
for (i=0;i<9;i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
运行结果:
1 20 25 28 33 42 59 67 91