C语言讲义——冒泡排序(bubble sort)
冒泡排序三步走:
- 循环
- 交换
- 回一手
- 一个数和其它数比较(循环)
- 每个数都要做这种比较(再一层循环)
准备工作
#include <stdio.h>
void sort(int arr[],int len) {
}
// 打印数组
void printArray(int arr[],int len ) {
int i = 0;
for(i = 0 ; i<len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main(int argc, char *argv[]) {
// 定义数组
int a[5]= {5,4,3,2,1};
// 获取获取长度
int nLen = sizeof(a)/sizeof(int) ;
// 调用函数
sort(a, nLen);
// 输出结果
printArray(a, nLen);
return 0;
}
循环、交换
void sort(int arr[],int len) {
int tmp = -1;
int i=0;
for(i; i<len; i++) {
printf("i=%d:\n", i);
int j = 0;
for(j; j < len-1; j++) {
printf(" 比较%d %d ", arr[j],arr[j+1]);
if (arr[j] > arr[j+1]) {
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
printf("\n", i);
}
}
绿色代表不必要的比较
通过以下处理可以提高效率:
1.内层循环每次-i
2.外层循环最后一次不需要
回一手
void sort(int arr[],int len) {
int tmp = -1;
int i=0;
for(i; i<len-1; i++) {
printf("i=%d:\n", i);
int j = 0;
for(j; j < len-1-i; j++) {
printf(" 比较%d %d ", arr[j],arr[j+1]);
if (arr[j] > arr[j+1]) {
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
printf("\n", i);
}
}
总结:冒泡排序三步走,
- 循环
- 交换
- 回一手
不回一手也行,就是效率稍低一点点。