目录
先看整体代码,代码解释在下面!!
void BubbleSort(int array[], int size)
{
// 外层循环控制冒泡排序的趟数
// size-1表示:最后一趟区间中只剩余1个元素,该趟冒泡可以省略
for(int i = 0; i < size-1; ++i)
{
// 具体冒泡的方式:用相邻的两个元素进行比较,前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾
for(int j = 1; j < size-i; ++j)
{
if(array[j-1] > array[j])
{
int temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;
}
}
}
}
/*
优化:如果某次冒泡结束后,序列已经有序了,后面剩余元素的冒泡可以省略
*/
void BubbleSort(int array[], int size)
{
// 外层循环控制冒泡排序的趟数
// size-1表示:最后一趟区间中只剩余1个元素,该趟冒泡可以省略
for(int i = 0; i < size-1; ++i)
{
int isChange = 0;
// 具体冒泡的方式:用相邻的两个元素进行比较,前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾
for(int j = 1; j < size-i; ++j)
{
if(array[j-1] > array[j])
{
int temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;
isChange = 1; // 如果本次冒泡进行数据交换了,说明本次还是无序的,就将isChange设置为1
}
}
// 如果本次冒泡中,元素没有交换,则本次开始冒泡时,数据已经有序了,后面的冒泡可以不用进行了
if(!isChange)
return;
}
}
普通思路
用遍历的方法,即将数组中的全部元素都拿出来一遍,然后两个两个进行比较,如果前一个元素大于后一个元素,那就交换两个元素的地址中存放的数据。直到数据全部被比较完才结束
外层for循环则是用来对每个位置的元素都进行一次排序,如果一个数组中有10个数字那就需要进行9次遍历,不用10次的原因是,在第九次排序的时候,整个数组其实已经排序完成,无需进行下一次排序。
内层的for循环则是用来对元素进行排序的,如果前一个元素大于后一个元素,那就将两个元素地址里存放的数据交换,直到排到第10个位置,本次循环结束,因为第10个位置的数据经过这一次排序已经是最大的,所以size - i的含义就是,在下一次排序的时候少算上次排序时最后的位置。
void BubbleSort(int array[], int size)
{
// 外层循环控制冒泡排序的趟数
// size-1表示:最后一趟区间中只剩余1个元素,该趟冒泡可以省略
for(int i = 0; i < size-1; ++i)
{
// 具体冒泡的方式:用相邻的两个元素进行比较,前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾
for(int j = 1; j < size-i; ++j)
{
if(array[j-1] > array[j])
{
int temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;
}
}
}
}
优化思路
优化思路可以先考虑,如果10个数字在排序过程中,还没执行9次,就已经排序完成,类似 132,如果按照普通思路来排序可能需要排三次,这样加大了计算机计算时间。
如果可以在第一次排好后,就停止排序,那是不是就节省了时间。
所以在优化的代码里加上一个ischange变量。将其放在内循环上面,用于每次对数组内容的判断,在下面if 判断语句中,如果ischange变为了1,那就说明这次循环还是发生了改变的,还没排序完成,在最下面用 if(!ischange)来判断ischange是否等于1。
!的意思是取反操作符,用于将“true”变为“false”,反之相同。如果ischange=1,那它的取反就是0,if 语句不执行就不会return,函数继续循环,直到ischange = 0,取反为1,进入if语句,return返回直接结束函数。
/*
优化:如果某次冒泡结束后,序列已经有序了,后面剩余元素的冒泡可以省略
*/
void BubbleSort(int array[], int size)
{
// 外层循环控制冒泡排序的趟数
// size-1表示:最后一趟区间中只剩余1个元素,该趟冒泡可以省略
for(int i = 0; i < size-1; ++i)
{
int isChange = 0;
// 具体冒泡的方式:用相邻的两个元素进行比较,前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾
for(int j = 1; j < size-i; ++j)
{
if(array[j-1] > array[j])
{
int temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;
isChange = 1; // 如果本次冒泡进行数据交换了,说明本次还是无序的,就将isChange设置为1
}
}
// 如果本次冒泡中,元素没有交换,则本次开始冒泡时,数据已经有序了,后面的冒泡可以不用进行了
if(!isChange)
return;
}
}