给定一串数字,(15,6,8,11,2),将其从小到大排序。
冒泡排序
依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
原数据:15,6,8,11,2
第一趟:一个数据和第二个数据进行比较,15大于6,所以交换,变成
6,15,8,11,2
第二个数据和第三个数据进行比较,15大于8,所以交换,变成
6,8,15,11,2
第三个数据和第四个数据进行比较,15大于11,所以交换,变成
6,8,11,15,2
第四个数据和最后一个数据进行比较,15大于2,所以交换,变成
6,8,11,2,15
第一趟结束,最大值已经被放在最后一位,如果从大到小排序,第一趟后最小值会被放到最后一位。
第二趟重复第一趟的过程,但是比较次数会减一,15不做处理(已经是最大值),可以想象成只有前四个数字,进行第一趟排序。
以此类推,比较4趟,最后得到,2,6,8,11,15
核心代码
int array[5] = {15,6,8,11,2};
// 动态计算数组的元素个数 5
int length = sizeof(array) / sizeof(array[0]);
int temp=0; //中间变量
for (int i = 0; i < length-1; i++) //比较的趟数
{
for (int j = 0; j < length-1- i; j++) //每一趟比较的次数,动态变化
{
if (arr[j] > arr[j+1])
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
选择排序
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
给定一串数字,(15,6,8,17,2),将其从小到大排序。
第一趟,设定第一位为最小值,依次和剩余数字进行比较,与冒泡排序不同的是,一趟只进行一次交换。
找到6,8,17,2中最小的值2 然后才和15交换
变成 2,6,8,17,15
第二趟,将6设为最小值,依次和剩余数字进行比较,发现没有比自己小的,所以不进行交换,保持原数值。
第三趟,将8设为最小值,依次和剩余数字进行比较,发现没有比自己小的,所以不进行交换,保持原数值。
第四趟(最后一趟),将17设为最小值,依次和剩余数字进行比较,找到15,交换
变成 2,6,8,15,17
核心代码
int array[5] = {15,6,8,17,2};
int length = sizeof(array) / sizeof(array[0]); //动态计算数组的元素个数(5)
int temp =0; 中间变量,用于交换两个数值
for(int i = 0; i < length-1; i++){ //比较的趟数
int min = i; 每一次数组下标赋给min 即 array[min]=array[i]
for(int j = i+1 ; j< length ; j++){ //这个for循环用于找到 未排序的最小值
if(a[min] < a[k]){
min = j;
}
}
temp = a[i]; //未排序的第一位和最小值交换数值
a[i] = a[min];
a[min] = temp ;
}
冒泡排序和选择排序的区别:
冒泡算法,每次比较如果发现较小的元素在后面,就交换两个相邻的元素。而选择排序算法的改进在于:先并不急于调换位置,先从A[1]开始逐个检查,看哪个数最小就记下该数所在的位置P,等一躺扫描完毕,再把A[P]和A[1]对调,这时A[1]到A[10]中最小的数据就换到了最前面的位置。
所以,选择排序每扫描一遍数组,只需要一次真正的交换,而冒泡可能需要很多次。比较的次数是一样的。