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