冒泡排序算法是个入门的排序算法,可能是很多人接触过的第一个排序算法,算法本身很简单,主要步骤如下:
1、从前到后遍历数组,依次比较当前元素和
下一个元素。如果当前元素大于下一个元素,
则对调当前元素和下一个元素;如果当前元素
不大于下一个元素,什么也不用做,继续遍历
下一个元素。这样经过一轮遍历后,最大的元
素就排到了数组的尾部,找到了最大的元素。
2、重复第一步,依次找到第二大、第三大等
元素等等,并放到适当的位置。
算法的动图(网上找的)演示如下:
常规排序代码如下:
int arr[] = {2, 4, 0, 5, 7, 1, 3, 8, 9};
int len = sizeof(arr) / sizeof(arr[0]);
int max = len;
while (max > 0) {
for (int i = 0; i < max - 1; i++) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
max--;
}
接下来说下可以优化的点,如果这个数组的前部分本身就是有序的,只是后面一部分元素是乱序的,其实本必要做完所有轮次的排序,可以提早结束遍历,提高程序性能。提高结束遍历的条件是:
如果某轮排序结束后,在本轮排序中,没有需要
发生元素顺序的调换,那么就可以认为当前的数
组中,所有元素都是有序的了,可以退出遍历。
优化后的代码为:
int arr[] = {2, 4, 0, 5, 7, 1, 3, 8, 9};
int len = sizeof(arr) / sizeof(arr[0]);
int max = len;
while (max > 0) {
int replace = 0;
for (int i = 0; i < max - 1; i++) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
replace++;
}
}
if (replace == 0) {
break;
}
max--;
}
以程序的测试数据为例,优化前,循环次数为36次,优化后,循环次数减少到30次,减少6次,减少16.67%的循环次数。如果数组乱序程度不是很大的情况下,减少的幅度应该是比较可观的。
页面更新:2024-03-13
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号