1.7 冒泡排序
1.7.1 介绍
冒泡排序(Bubble Sort)一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
1.7.2 原理
冒泡排序的原理:
1.7.3 未优化的冒泡排序实现
注:sort.h 在c语言排序总结—前序准备中
未优化的冒泡排序代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include "sort.h"
int main() {
//生成LENGTH长度的随机数组,并展示出来
int arr[LENGTH];
createRandomArray(arr);
int count = 0;
for (int i = 0; i < LENGTH; i++) {
printf("%-10d", arr[i]);
count++;
if (count % 10 == 0) {
printf("\n");
}
}
printf("\n");
//统计冒泡排序的时间
int begin, end;
begin = clock();
//调用排序
bubbleSort(arr);
end = clock();
//输出排序结果
for (int i = 0; i < LENGTH; i++) {
printf("%-10d", arr[i]);
count++;
if (count % 10 == 0) {
printf("\n");
}
}
//输出排序时间
printf("排序时间为time=%d\n", end - begin);
system("pause");
}
//冒泡排序算法核心
void bubbleSort(int arr[]) {
int i, j;
for (i = 0; i < LENGTH; i++) {
for (j = i + 1; j < LENGTH; j++) {
if (arr[i] > arr[j]) {
swap(arr, i, j);
}
}
}
}
跑10000数据的排序使用时间为616毫秒
1.7.4 优化的冒泡排序实现
优化方法:
因为排序的过程中,个元素不断接近自己的位置,如果一趟比较下来所有元素都未经过交换,则说明排序已经完成,后续的排序已经没有必要,可以直接跳出循环。因此可以设计一个flag以判断程序是否使用过swap函数,如果一次循环过后未使用则跳出所有循环。
优化代码:
void optimizeBubbleSort(int arr[]) {
int i, j;
int flag;
for (i = 0; i < LENGTH; i++) {
flag = 0;
for (j = i + 1; j < LENGTH; j++) {
if (arr[i] > arr[j]) {
swap(arr, i, j);
flag = 1;
}
}
if (flag == 0) {
break;
}
}
}
优化后结果: