冒泡排序的改进

假如输入本身就是有一个有序的数组,或者在经过一轮循环后就已经有序,则之前的冒泡排序和选择排序都做了不少不必要的循环比较。因此,添加一个判断,如果报文在某次循环后已经有效,则停止排序。

以BubbleSort.c为例进行修改。BubbleSort_v2.c:

/*
 * 冒泡排序v2:1. 对相邻的元素进行比较,如果左边的元素大于右边的元素,则交换这两个元素.
 *            2. 如果在某一次循环中,数组已经排序好,则及时终止.
 * 算法复杂度:与选择排序相同,等于O(n^2).
 *
 */

#include <stdio.h>

#define SWAPPED_TRUE 1
#define SWAPPED_FALSE 0

static void print_arr(int arr[], int arr_size)
{
	int i;

	if(NULL == arr || arr_size <= 0)
		return;

	for(i = 0; i < arr_size; i++)
		printf("%d ", arr[i]);
	printf("\n");
}

int main()
{
	int i, j, temp_value, arr_size, swapped;

	int arr[] = {2, 3, 4, 6, 5, 8, 9};

	arr_size = sizeof(arr)/sizeof(arr[0]);
	printf("Before sort: ");
	print_arr(arr, arr_size);

	/* Bubble Sort */
	for(i = arr_size-1; i > 0; i--) {
		swapped = SWAPPED_FALSE;
		for(j = 0; j < i; j++) {
			if(arr[j] > arr[j+1]) {
				temp_value = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp_value;

				swapped = SWAPPED_TRUE;
			}		
		}

		if(swapped == SWAPPED_FALSE) {
			printf("array is already sorted, loop index=%d, stop!\n", i);
			break;
		}
	}

	printf(" After sort: ");
	print_arr(arr, arr_size);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42263483/article/details/80699600