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("
");
}

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:
", 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("
", 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:
", 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("
", i);
	}
}

总结:冒泡排序三步走,

  1. 循环
  2. 交换
  3. 回一手

不回一手也行,就是效率稍低一点点。

原文地址:https://www.cnblogs.com/tigerlion/p/11191536.html