现在假设有5个数,现在要对他进行从小到大的排序
第一轮:
第一次比较:
1 | 2 | 3 | 4 | 5 | ——> | 2 | 1 | 3 | 4 | 5 |
第二次比较:
2 | 1 | 3 | 4 | 5 | ——> | 2 | 3 | 1 | 4 | 5 |
第三次比较:
2 | 3 | 1 | 4 | 3 | ——> | 2 | 3 | 4 | 1 | 5 |
第四次比较:
2 | 3 | 4 | 1 | 5 | ——> | 2 | 3 | 4 | 5 | 1 |
第二轮:
第一次比较:
2 | 3 | 4 | 5 | 1 | ——> | 3 | 2 | 4 | 5 | 1 |
第二次比较:
3 | 2 | 4 | 5 | 1 | ——> | 3 | 4 | 2 | 5 | 1 |
第三次比较:
3 | 4 | 2 | 5 | 1 | ——> | 3 | 4 | 5 | 2 | 1 |
第三轮:
第一次比较:
3 | 4 | 5 | 2 | 1 | ——> | 4 | 3 | 5 | 2 | 1 |
第二次比较:
4 | 3 | 5 | 2 | 1 | ——> | 4 | 5 | 3 | 2 | 1 |
第四轮:
第一次比较:
4 | 5 | 3 | 2 | 1 | ——> | 5 | 4 | 3 | 2 | 1 |
一丶冒泡排序
过以上比较过程可以得出,如果比较n个数,只需要比较n-1轮即可;而且每轮比较的次数会随着比较轮数的增加而减小,而且轮数和每轮比较次数的和是固定的值,都是比较的个数n。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int arr[5]={5,4,3,2,1}; //定义数组
for(int m = 0; m < 4;m++) //设置需要比较的轮数
{
for(int n = 0;n<4-m;n++) //设置每轮需要比较的次数
{
if(arr[n]>arr[n+1])
{
int i = arr[n]; //设置中间变量,如果前面数大于后面的数就交换
arr[n]=arr[n+1];
arr[n+1]=i;
}
}
}
for(int b = 0;b<5;b++) //循环遍历打印数组
printf("%d ",arr[b]);
return 0;
}
二丶选择排序
选择排序的思想和冒泡排序几乎一样,只不过选择排序是将最小的值的下标存储起来,然后进行交换
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[5] = {5,4,3,2,1}; //定义数组
for (int j = 0; j < 5 - 1; j++) //设置比较轮数
{
int k = j; //设置存储下标的变量
for (int i = j + 1; i < 5; i++) //设置比较次数
{
if (a[k] > a[i]) //如果后面的值小于前面的值,则把后面值的下表存储到k中
{
k = i;
}
}
if (k != j) //如果交换后下表仍等于j,则不需要交换,否则需要交换
{
int tem = a[k];
a[k] = a[j];
a[j] = tem;
}
}
for (int i = 0; i < 5; i++) //循环遍历打印数组
{
printf("%d ", a[i]);
}
return 0;
}