1 void bubbleSort(LineList R[], int n) 2 { 3 int i, j; 4 for (i = 1; i < n; i++) 5 { 6 for (j = 1; j <= n - i; j++) 7 { 8 if (R[j].key > R[j + 1].key) 9 { 10 R[0] = R[j]; 11 R[j] = R[j + 1]; 12 R[j + 1] = R[0]; 13 } 14 } 15 } 16 }
上面代码效率还是比较低下的,因为有可能中间某次就有序了,但是依然多执行了很多次循环,可以改为如下算法:
1 void bubbleSort(ElementType A[], int N) 2 { 3 int p, i; 4 bool flag; 5 6 for (p = N - 1; p >= 0; p--) 7 { 8 /* 标记该次循环中是否发生交换;若无,则说明整个序列有序 */ 9 flag = false; 10 /* 一趟冒泡 */ 11 for (i = 0; i < p; i++) 12 { 13 /* 每次循环找出一个最大元素并交换到最右端 */ 14 if (A[i] > A[i + 1]) 15 { 16 swap(&A[i], &A[i + 1]); 17 flag = true; 18 } 19 } 20 21 /* 若全程无交换则跳出循环 */ 22 if (flag == false) 23 { 24 break; 25 } 26 } 27 }
稳定性:稳定
复杂度:
(1)最好:O(N)
(2)最坏:O(N2)