1、冒泡排序的原理;
-
在了解冒泡排序原理之前我们先引入例子:
将数组int arr[]={54,63,25,15,2}按数组的元素进行升序或者降序 -
原理:是将前后数组内的两个元素进行比较(我们这个例子进行升序排序,降序排序原理相同),大的元素位置往后调整,后面元素依次执行。
-
我们来看一下实现过程:
54 , 63, 25, 15 , 2 >>进行第一次排序:
54 和 63 比较 54< 63 -----------> 54, 63
63 和 25 比较 25 < 63 ----------> 54, 25 , 63
63 和 15 比较 ---------------------> 54, 25, 15, 63
63 和 2 比较 -----------------------> 54, 25 , 15, 2, 63
进行第二次排序
- 原理和第一次排序原理相同;
25 15 2 54 63
进行第三次排序
15 2 25 54 63
进行第四次排序
2 15 25 54 63
这里我们可以看到整个数组里的元素已经按照升序要求排序完成;
5个元素分步要进行4次排序。
2、每一轮比较代码实现;
//冒泡排序法 将第i个数和i+1个数进行比较,把大的数放在arr[i]里,把小的数放在arr[i+1]里
int main()
{
// 未进行排序前的数组,
int arr[] = { 54,63,25,15,2 };
printf("冒泡排序前:");
for (int i = 0; i <= sizeof(arr) / sizeof(arr[0]) - 1; i++){
printf("%d ", arr[i]);
}
//打印为排序前的数组
printf("\n");
//第一次排序
printf("第1次排序;\n");
for (int i = 0; i < (sizeof(arr)/sizeof(arr[0]) - 1); i++){
if (arr[i] > arr[i + 1]){
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
//按照大小 把小的元素放在前面,大的元素放在后面
}
}
for (int i = 0; i <= sizeof(arr) / sizeof(arr[0]) - 1; i++){
printf("%d ", arr[i]);
}
printf("\n");
//打印第一次排序结果;
//第二次排序
printf("第2次排序;\n");
for (int i = 0; i < (sizeof(arr) / sizeof(arr[0]) - 1); i++){
if (arr[i] > arr[i + 1]){
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
for (int i = 0; i <= sizeof(arr) / sizeof(arr[0]) - 1; i++){
printf("%d ", arr[i]);
}
//打印第二次排序结果
// 第三次排序
printf("\n");
printf("第3次排序;\n");
for (int i =0; i < (sizeof(arr) / sizeof(arr[0]) - 1); i++){
if (arr[i] > arr[i + 1]){
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
for (int i = 0; i <= sizeof(arr) / sizeof(arr[0]) - 1; i++){
printf("%d ", arr[i]);
}
printf("\n");
//打印第三次排序结果
//第四次排序
printf("第4次排序;\n");
for (int i = 0; i < (sizeof(arr) / sizeof(arr[0]) - 1); i++){
if (arr[i] > arr[i + 1]){
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
for (int i = 0; i <= sizeof(arr) / sizeof(arr[0]) - 1; i++){
printf("%d ", arr[i]);
}
printf("\n");
//第四次打印结果
//程序运行结果为
冒泡排序前:54 63 25 15 2
第1次排序;
54 25 15 2 63
第2次排序;
25 15 2 54 63
第3次排序;
15 2 25 54 63
第4次排序;
2 15 25 54 63
请按任意键继续. . .
3、完整代码实现;
int main()
{
int arr[] = { 54,63,25,15,2 };
printf("冒泡排序前:");
for (int i = 0; i <= sizeof(arr) / sizeof(arr[0]) - 1; i++){
printf("%d ", arr[i]);
}
printf("\n");
printf("改进后的排序结果:\n");
for (int j = 0; j < sizeof(arr) / sizeof(arr[0]) - 1; j++){
//外层for循环表示需要进行几次排序。此次排序我们需要进行4次排序。
for (int i = 0; i < (sizeof(arr) / sizeof(arr[0]) - 1); i++){
//内层for循环是进行比较大小以及赋值的单结果
if (arr[i] > arr[i + 1]){
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
for (int i = 0; i <= sizeof(arr) / sizeof(arr[0]) - 1; i++){
printf("%d ", arr[i]);
//打印数组
}
printf("\n");
system("pause");
return 0;
}
//运行结果为
冒泡排序前:54 63 25 15 2
改进后的排序结果:
2 15 25 54 63
请按任意键继续. . .