目录
这里我们实现一个冒泡排序,将一个整形数组排序,首先我们要知道什么是冒泡排序。
什么是冒泡排序?
冒泡排序的思想简单来说就是两两相邻的元素进行比较,有可能的话需要交换。
这里我们对一组整数进行排序,目标是:升序
假设这组整数原本的顺序是
9,8,7,6,5,4,3,2,1,0
这时候我们就会把他第一个和第二个数子拿出来作比较
9,8,7,6,5,4,3,2,1,0 9>8
不满足升序的条件,这个时候我们就需要交换这两个数字,他就会变成
8,9,7,6,5,4,3,2,1,0
这个时候我们再对比第二个和第三个数字
8,9,7,6,5,4,3,2,1,0 9>7
不满足升序的条件,这个时候我们就需要交换这两个数字,他就会变成
8,7,9,6,5,4,3,2,1,0
这个时候我们再对比第三个和第四个数字
8,7,9,6,5,4,3,2,1,0 9>6
不满足升序的条件,这个时候我们就需要交换这两个数字,他就会变成
8,7,6,9,5,4,3,2,1,0
这个时候我们再对比第四个和第五个数字
8,7,6,9,5,4,3,2,1,0 9>5
不满足升序的条件,这个时候我们就需要交换这两个数字,他就会变成
8,7,6,5,9,4,3,2,1,0
....................................................
..................以此类推...................
....................................................
直到我们对比第九个和第十个数字
8,7,6,5,4,3,2,1,9,0 9>0
不满足升序的条件,这个时候我们就需要交换这两个数字,他就会变成
8,7,6,5,4,3,2,1,0,9
这个时候,9就到了正确的位置,我们剩下待排序的内容就是
8,7,6,5,4,3,2,1,0
然后再进行上述操作,一一比较两个相邻的元素,他就会变成
7,6,5,4,3,2,1,8,9
然后这个时候8也到了正确的位置,我们剩下的排序内容就右减小了一个数字,变成了
7,6,5,4,3,2,1,0
....................................................
..................以此类推...................
....................................................
最终就会变成我们想要的结果
0,1,2,3,4,5,6,7,8,9
这就是冒泡排序
由上我们可以知道,一趟冒泡排序解决一个数字,然这个数字来到为最终因该出现的位置上,假设这个整形数组里面有n个数字,而解决整个排序,就需要 n-1 躺冒泡排序。
冒泡排序思路
我们首先定义一个整型数组和函数。
#include<stdio.h>
void Sort(int arr[])
{
}
int main()
{
//整形数据
int arr[] = { 2,3,8,4,6,9,5,7,1,0 };
//写一个函数对数组进行排序
Sort();
return 0;
}
然后我们需要得知数组的元素个数有几个,这样我们才能知道需要进行多少趟冒泡排序。
注意:这里我们用数组总元素个数除以第一个数组第一个元素,就能得到数组的元素个数。
然后再把 sz 传到函数里面。
#include<stdio.h>
void Sort(int arr[], int sz)
{
}
int main()
{
//整形数据
int arr[] = { 2,3,8,4,6,9,5,7,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
//写一个函数对数组进行排序
Sort(arr,sz);
return 0;
}
紧接着下来我们就要确定冒泡排数的趟数
#include<stdio.h>
void Sort(int arr[], int sz)
{
//趟数
int i = 0;
for (i = 0; i <= sz - 1; i++)
{
//一趟冒泡排序
}
}
int main()
{
//整形数据
int arr[] = { 2,3,8,4,6,9,5,7,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
//写一个函数对数组进行排序
Sort(arr,sz);
return 0;
}
当有十个元素时,我们要对比九对
当有九个元素时,我们要对比八对,以此类推。
这里我们定义一趟冒泡排序里面我们要对比多少次。
#include<stdio.h>
void Sort(int arr[], int sz)
{
//趟数
int i = 0;
for (i = 0; i <= sz - 1; i++)
{
//一趟冒泡排序
int j = 0;
for(j=0;j<;j++)
{
}
}
}
int main()
{
//整形数据
int arr[] = { 2,3,8,4,6,9,5,7,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
//写一个函数对数组进行排序
Sort(arr,sz);
return 0;
}
现在我们知道了冒泡排序要排序几趟,一趟里面要对比几次,这时我们就要写判断条件。
判断条件很简单,我们就是要第一个元素和第二个元素相比较,当第一个元素比第二个元素小时,我们就不交换,只有当第一个元素比第二个元素大时,我们就要交换两个元素。
#include<stdio.h>
void Sort(int arr[], int sz)
{
//趟数
int i = 0;
for (i = 0; i <= sz - 1; i++)
{
//一趟冒泡排序
int j = 0;
for(j=0;j<;j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
//整形数据
int arr[] = { 2,3,8,4,6,9,5,7,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
//写一个函数对数组进行排序
Sort(arr,sz);
return 0;
}
这时候我们就要编辑这里的判断条件
这里我们假设10个元素,我们就要对比9次
然后会变成9个元素,我们就要对比八次
这里写 sz-1 肯定是不合适的
正确写法是 sz-1-i
假设 10 个元素
第一趟 10-1-0 就是9
第二趟 10-1-1 就是8
以此类推...
最后再把数组打印出来就完成啦!
#include<stdio.h>
void Sort(int arr[], int sz)
{
//趟数
int i = 0;
for (i = 0; i <= sz - 1; i++)
{
//一趟冒泡排序
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
//整形数据
int arr[] = { 2,3,8,4,6,9,5,7,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
//写一个函数对数组进行排序
Sort(arr,sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d",arr[i]);
}
return 0;
}
运行效果:
总结:
冒泡排序相对简单,只要逻辑疏通了,再加上注意一些小细节,比如 sz 要在主函数里面定义,因为数组名我们在上一篇讲过,是首元素的地址,当他传到以 void Sort(int arr[], int sz)这种当时传到函数里面,他只有一个元素,这样 sz 就求不出来数组元素的个数。
因为是地址,按道理来说我们因该用指针来接收,但是即使用指针来接收,我们在函数里面求数组个数也是行不通的,因为指针变量不是4就是8。
void Sort(int * arr, int sz)