冒泡排序
冒泡排序是一种常用且非常简单的排序法,对数组内的元素进行比较排序,它的算法描述如下:
-
比较相邻的两个元素,如果第一个比第二个大,就交换它们的位置
-
对每一对相邻元素都进行比较,比较完后找到最大值
-
重复以上步骤,每次比较次数减一次,直到不需要进行比较
冒泡排序具体实现过程:
-
首先定义一个无序数组
-
使用两个for循环,外循环每次执行次数减一次,内循环进行元素比较
参考代码:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int arr[10];
int n = sizeof(arr)/sizeof(arr[0]);
int temp = 0;
printf("请输入%d个整数:",n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
//比较相邻两个数的大小,并交换两个数的位置
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(arr[j]>arr[j+1])
{
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
printf("排序后的数列:");
for(int i=0;i<n;i++){
printf("%d ",arr[i]);
}
return 0;
}
改进优化:如果在一次冒泡中没有进行交换,表明数列已经有序则不需要再进行冒泡,然后退出。
使用标志位来记录有无元素位置交换。
参考代码:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int arr[10];
int n = sizeof(arr)/sizeof(arr[0]);
int temp = 0;
int flag = 0;//默认为有序(改进)
printf("请输入%d个整数:",n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
//比较相邻两个数的大小,并交换两个数的位置
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(arr[j]>arr[j+1])
{
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
flag = 1;
}
}
if(flag == 0){
break;
}
}
printf("排序后的数列:");
for(int i=0;i<n;i++){
printf("%d ",arr[i]);
}
return 0;
}
}