作业标题
冒泡排序
作业内容
实现一个对整形数组的冒泡排序
2.解题思路
先了解一下冒泡排序:
两两相邻的元素进行比较,如果前面元素大于后面元素就交换两个元素的位置,最终的结果是最大的一个元素移动到了最后的位置。
如果有n个元素那么【冒泡操作】重复n-1次即可排序完成。
3.具体代码
void bubble_sort(int arr[], int sz) {
//趟数
int i = 0;
for (i = 0; i < sz - 1; i++) {
//一趟内部的两两比较
int j = 0;
for (j = 0; j < sz - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[] = { 1, 3, 2, 8, 34, 4, 77, 85, 96, 1, 10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
printf("排序之前:");
for (i = 0; i < sz; i++){
printf("%d ", arr[i]);
}
printf("\n");
bubble_sort(arr, sz);
printf("\n排序之后:");
for (i = 0; i < sz; i++){
printf("%d ", arr[i]);
}
return 0;
}
打印:
代码讲解:
-
先定义一个整型数组
arr
,用来存放要排序的元素。 -
定义一个整型变量
sz
,利用sizeof
函数来求arr
数组里元素的个数。 -
定义整形变量
i
,打印排序之前:
-
进入
for
循环,依次通过数组下标打印原数组元素。 -
换行
-
将数组首元素地址
arr
和数组元素个数sz
作为实参传递给bubble_sort()
函数 -
先定义整型变量
i
。 -
进入for循环,这里的for循环是嵌套的,当i=0的时候,把arr[0]和后面的其他元素依次比较。
如果arr[0]里面的元素比arr[1]大,那么就互换两个元素。
换完之后如果arr[1]的元素比arr[2]大,那么就互换两个元素。重复操作。
换完之后如果arr[1]的元素比arr[2]小,那么就继续进入外层循环。
-
如果arr[0]里面的元素比arr[1]小,那么就继续进入外层循环,取出arr[1]和后面的元素比较,重复上面的操作。
-
bubble_sort()
函数执行完成后,数组的元素就被排序成功了。 -
换行,打印:
排序之后:
-
进入
for
循环,依次通过数组下标打印冒泡排序后的数组元素。
优化:如果某次冒泡结束后,序列已经有序了,后面剩余元素的冒泡可以省略
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;
}
}