题目
利用冒泡排序算法对一组无序数组进行递增排序
排序步骤
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
代码实现
/**
* @Author zzw2000
* @Date 2022年08月15日 20:14
* @Description 冒泡排序
* 依次比较数组中的相邻两个元素大小,若array[i]>array[i+1],则交换两个元素,
* 两两都比较称作一轮冒泡,结果是最大的元素排至最后
* 重复上述步骤,直至整个数组有序
*/
public class BubbleSort {
public static void main(String[] args) {
int[] array = {5, 9, 7, 4, 1, 3, 2, 8};
bubbleSort(array);
}
/**
* 冒泡排序
*
* @param array 需要排序的数组
*/
private static void bubbleSort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
boolean swapped = false; //是否发生交换
for (int j = 0; j<array.length - 1; j++) {
System.out.println("比较次数:" + (i + 1));
if (array[i] > array[i+1]) {
int temp = array[i];
array[i] = array[i + 1];
array[i + 1] = temp;
swapped = true;
}
}
System.out.println("第" + j + "轮冒泡:" + Arrays.toString(array));
if (!swapped) {
break;
}
}
}
}
算法优化
记录每轮最后一次交换元素时的索引位置,将其作为下一轮冒泡的比较次数,如果该值为0,表示排序成功,退出循环。
private static void bubbleSort(int[] array) {
int n = array.length - 1; //下一轮要循环比较的次数
do () {
int last =0; //最后一次发生交换索引位置
for (int i =0; i < n; i++) {
System.out.println("比较次数:" + (i + 1));
if (array[i] > array[i+1]) {
int temp = array[i];
array[i] = array[i + 1];
array[i + 1] = temp;
last = i;
}
}
System.out.println(Arrays.toString(array));
n = last;
} while (n != 0);
}
#include <stdio.h>
/**
* 冒泡排序
* @param array 数组
* @param length 数组长度
*/
void bubbleSort(int *array, int length);
int main() {
int array[] = {5, 9, 7, 4, 1, 3, 2, 8};
int length = sizeof(array) / sizeof(array[0]);
bubbleSort(array, length);
return 0;
}
void bubbleSort(int *array, int length) {
int n = length - 1; //下一轮排序要比较的次数
do {
int last = 0; //最后一次发生交换索引位置
for (int i = 0; i < n; i++) {
if (array[i] > array[i + 1]) {
int temp = array[i];
array[i] = array[i + 1];
array[i + 1] = temp;
last = i;
}
}
n = last;
} while (n != 0);
for (int i = 0; i < length; i++) {
printf("%d\x20", array[i]);
}
}