今天讲的比较难的点事冒泡和选择排序,结合代码和自己的理解总结了一下。
语言中,常用的算法有:冒泡排序、快速排序、插入排序、选择排序、希尔排序、堆排序以及归并排序等等。
冒泡排序法(Bubblesort)
所谓排序法,就是对一组无序的序列进行有序的排序(从大到小或者从小到大),那么什么叫冒泡排序法,冒泡排序法又是怎么实现数组的有序排列呢。
冒泡排序法的具体实现方法是这样的,从数组的第一个元素`a[0]`开始,两两比较**(`a[j],a[j+1]`),如果前面的数大于后面的数(`a[j] > a[j+1]`),那么交换两个元素的位置,把大的数往后移动。这样依次经过一轮比较以后,最大的数将会被交换到最后的位置(a[j-1])。
先一起再来看看冒泡排序法是怎么排序的。
第1次循环 1 2 3 4 5 6 7 8 9 0
弟2次循环 2 3 4 5 6 7 8 9 1
第3次循环 3 4 5 6 7 8 9 2
第4次循环 4 5 6 7 8 9 3
第5次循环 5 6 7 8 9 4
第6次循环 6 7 8 9 5
第7次循环 7 8 9 6
第8次循环 8 9 7
第9次循环 9
可以看到,每一轮的排序,在这一轮中参与比较的元素中最大的数将会浮到最后。而冒泡排序的名字也是从这里来的 。
冒泡排序
#include <stdio.h>
int main()
{
int i,j;
int temp;
int a[10]={0,1,2,3,4,5,6,7,8,9};随机定义数组
int len = sizeof(a) / sizeof(int);//计算元素的个数
for(i = 0;i < len - 1;i++)//循环次数为元素的数量减一,最后一个元素不需要单独运行一次
{
for(j = 0;j < len - i -1;j++)//由于后面的已经排列所以每次比较的次数变少
{
if(a[j] < a[j + 1])//作用是把大的数放到数组的后面
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
for(j = 0;j < 10;j++)//循环输出
{
printf("%d ",a[j]);
}
printf("\n");
}
return 0;
}
选择排序法(Selectionsort)
所谓的选择是什么意思呢,选择就是于万千花丛中择其一,在选择排序法中说的就是,每一次循环过程中,通过比较选择出你需要的**最值**。
选择排序法的过程是,通**过比较,选择出每一轮中最值元素,然后把他和这一轮中最最前面的元素交换**,所以这个算法关键是要记录每次比较的结果,即每次比较后最值位置(下标)。
先来看看选择排序的过程:
第1次排序 1 3 6 7 8 5 4 9 2 10
第2次排序 1 2 6 7 8 5 4 9 3 10
第3次排序 1 2 3 7 8 5 4 9 6 10
第4次排序 1 2 3 4 8 5 7 9 6 10
第5次排序 1 2 3 4 5 8 7 9 6 10
第6次排序 1 2 3 4 5 8 7 9 6 10
第7次排序 1 2 3 4 5 6 7 9 8 10
第8次排序 1 2 3 4 5 6 7 8 9 10
第9次排序 1 2 3 4 5 6 7 8 9 10
选择排序
#include <stdio.h>
int main()
{
int a[10] = {10,3,6 ,7, 8 ,5 ,4 ,9, 2 ,1}; //随机定义一个数组
int i,j;
int min;
int len = sizeof(a) / sizeof(int);//计算数组元素的个数
for(i = 0;i < len -1;i++)//循环的次数是元素个数减一,因为前面位置确定,最后一位不需要比较或pai排序
{
min = i;//引入min,用来确定最小值的位置
for(j = i + 1;j < len;j++)//起点为下一位,用来和qian前一位比较
{
if(a[min] > a[j])
{
min = j;//本循环作用为确定最小值
}
}
if(min != i)
{
int temp = a[i];
a[i] = a[min];
a[min] = temp;
}//把该最小值按次序放入数组
for(j = 0;j < len;j++)
{
printf("%d ",a[j]);
}//循环输出数组
printf("\n");//换行,增强可读性
}
return 0;
}