目录1.冒泡排序
2.冒泡排序的使用
冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来,冒出来后,也就完成了一小步。
冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来,冒出来后,也就完成了一小步。
以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。
代码如下
#include<stdio.h>
void Bubble_sort(int arr[], int size)//int arr[]等价于int *arr
{
int j,i;
for (i = 0; i < size-1;i ++)//size-1是因为不用与自己比较,所以比的数就少一个
{
int count = 0;
for (j = 0; j < size-1 - i; j++) //size-1-i是因为每一趟就会少一个数比较
{
if (arr[j] > arr[j+1])//这是升序排法,前一个数和后一个数比较,如果前数大则与后一个数换位置
{
int tem = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tem;
count = 1;
}
}
if (count == 0) //如果某一趟没有交换位置,则说明已经排好序,直接退出循环
break;
}
}
int main()
{
int arr[10];
int i;
printf("请输入10个数\n");
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
printf("排序前的数组>");
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n排序后的数组>");
Bubble_sort(arr, 10);
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
-
运行结果如下
1.有序序列判断_牛客题霸_牛客网 (nowcoder.com)大致思路就是:对一个已经输入的数组,进行三部判断(1.是否为升序,2.是否为降序,3.改数组是否为一个常数数组)三者只要符合其中一种那么就是一个有序数组;
- 我是采用的函数的写法,这是代码的一部分,那么函数部分我很是不是可以使用与冒泡排序的原理实现呢?
int main() { int arr[100] = { 4, 4, 4, 4 }, b = 4, i = 0; scanf("%d", &b); for (i = 0; i < b; i++) { scanf("%d", &arr[i]); } bu(arr, b); return 0; }
1.判断是否为升序
int flag = 0;
for (j = 0; j < sz - 1; j++) { //判断是否为升序
if (p[j] < p[j + 1])//判断是否为升序
{
flag = 1;
} else//发现有的地方不符合升序条件
{//即也就是本数组部位升序数组
flag = 0;
break;//直接跳出本次判断是否为升序的判断
}
}
if (flag == 1)
{
goto again;//为了实现满足上述三者情况的一种即可
}
2.判断是否为降序
int flag = 0;
for (j = 0; j < sz - 1; j++)//判断是否为降序
{
if (p[j] > p[j + 1])//判断相邻两项是否为降序
{
flag = 2;
} else //发现不符合降序的情况
{
flag = 0;
break;//直接跳出本次判断
}
}
if (flag == 2)
{
goto again;//为了实现满足上述三者情况的一种即可
}
3.判断是否为常数数组
for (j = 0; j < sz - i - 1; j++)//比较是否为常数数组
{
if (p[j] < p[j + 1])
{
fla = 0;
}
}
if (fla == 1)
{
flag = 1;//为了实现满足上述三者情况的一种即可
}
三种情况我们全都已经实现,哪么我们只需要书写剩余的简单部分即可
全部代码如下
#include<stdio.h>
void bu(int* p, int sz) {
int i = 0, j = 0;
int flag = 0;
for (j = 0; j < sz - 1; j++) { //判断是否为升序
if (p[j] < p[j + 1])
{
flag = 1;
} else
{
flag = 0;
break;
}
}
if (flag == 1)
{
goto again;
}
for (j = 0; j < sz - 1; j++)
{ //降序
if (p[j] > p[j + 1])
{
flag = 2;
} else {
flag = 0;
break;
}
}
if (flag == 2)
{
goto again;
}
int fla = 1;
for (j = 0; j < sz - i - 1; j++)//比较是否为常数数组
{
if (p[j] < p[j + 1])
{
fla = 0;
}
}
if (fla == 1)
{
flag = 1;
}
again:
if (flag == 1 || flag == 2) {
printf("sorted\n");
} else {
printf("unsorted\n");
}
}
int main() {
int arr[100] = { 4, 4, 4, 4 }, b = 4, i = 0;
scanf("%d", &b);
for (i = 0; i < b; i++) {
scanf("%d", &arr[i]);
}
bu(arr, b);
return 0;
}
题目2序列中整数去重_牛客题霸_牛客网 (nowcoder.com)
上一个题冒泡排序体现的不明显,那么我们再看一题
思路就是跟冒泡排序简直一模一样,同样两层循环,外层为趟数,内层为比较
#include <stdio.h>
int main() {
int a,arr[100],arrr[100];
scanf("%d",&a);
int i=0;
for(i=0;i<a;i++){
scanf("%d",&arr[i]);
}
for(i=0;i<a;i++)//趟数
{
int j=0;
for(j=i+1;j<a;j++)
{
if(arr[i]==arr[j])//查重
{
arr[j]=0;//令重复的数为0,以便后面打印
}
}
}
for(i=0;i<a;i++)
{
if(arr[i]!=0)//将重复的不再打印
printf("%d ",arr[i]);
}
return 0;
}
总而言之冒泡排序就是从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来,冒出来后,也就完成了一小步。
在c语言中冒泡排序很重要,我们不仅要掌握,还需要会使用他的思路;