冒泡排序
30 20 50 40 10
第一趟:20 30 40 10 50
第二趟:20 30 10 40 50
第三趟:20 10 30 40 50
第四趟:10 20 30 40 50
1)算法
A.相邻元素两两比较,前者大于后者,彼此交换;
B.从第一对到最后一对,最大的元素沉降到最后;
C.针对未排序部分,重复以上步骤,沉降次大值;
D.每次扫描越来越少的元素,直至不再发生交换。
2)评价
A.平均时间复杂度:O(N^2)
B.稳定排序(等值元素在排序前后的顺序保持不变)。
30 20 50 40 10
第一趟:20 30 40 10 50
第二趟:20 30 10 40 50
第三趟:20 10 30 40 50
第四趟:10 20 30 40 50
1)算法
A.相邻元素两两比较,前者大于后者,彼此交换;
B.从第一对到最后一对,最大的元素沉降到最后;
C.针对未排序部分,重复以上步骤,沉降次大值;
D.每次扫描越来越少的元素,直至不再发生交换。
2)评价
A.平均时间复杂度:O(N^2)
B.稳定排序(等值元素在排序前后的顺序保持不变)。
C.对数据的有序性非常敏感。
#include <stdio.h>
#include <stdlib.h>
/* 冒泡排序 */
void bubble_sort (int data[], size_t size) {
size_t i;
for (i = 0; i < size - 1; ++i) {
int ordered = 1;
size_t j;
for (j = 0; j < size - 1 - i; ++j)
if (data[j+1] < data[j]) {
int swap = data[j];
data[j] = data[j+1];
data[j+1] = swap;
ordered = 0;
}
if (ordered)
break;
}
}
/* 测试用例 */
int main (void) {
srand (time (NULL));
int data[10];
size_t i, size = sizeof(data) / sizeof(data[0]);
for (i = 0; i < size; ++i)
printf ("%2d ", data[i] = rand () % 100);
printf ("\n");
bubble_sort (data, size);
for (i = 0; i < size; ++i)
printf ("%2d ", data[i]);
printf ("\n");
return 0;
}