冒泡排序的基本原理

数组

第一个和下一个比较,如果比下一个大,则和下一个交换位置。

然后该数又和再下一个比较,以此类推。

当第一个数放好位置后,第二个数来重复上面的过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>

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

//每当“冒泡”一次的时候,下一次冒泡就会少一次所以就需要用i--
//为了使得循环不奇怪掉,所以需要让i>0
for(int i = sizeof(arr) / sizeof(arr[0]);i>0;i--){

for (int j = 0; j < i - 1; j++) {
//这里用i-1 是为了不能溢出,跃出界限
if (arr[j]>arr[j+1]) {//第一个和第二个进行比较
//交换数组
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}

}
}
//打印字符
for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
printf("%d ", arr[i]);
}
return 0;
}

用sizeof()/sizeof(arr[0])来计算数据的个数

这里可以把交换数组的函数封装成一个函数,方便以后的调用

1
2
3
4
5
6
7
void exchange(int a[], int i, int j)
//a是要交换的数组,i和j是要进行交换的位置
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}

也可以把打印的封装成一个函数

1
2
3
4
void print(int a[], int sz) {
for (int i = 0; i < sz; i++)
printf("%d", a[i]);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>

void bubbleSort(int arr[], int n) {//n是元素个数
for (int i = 0; i < n - 1; i++) {//n-1是因为最后一个不需要判断了
for (int j = 0; j < n - i - 1; j++) {
//n-i的原因是,每比较一个就会少一次比较的次数
// 如果相邻元素顺序错误,交换它们的位置
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}

int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);

bubbleSort(arr, n);

printf("排序后的数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}

return 0;
}