所谓冒泡算法就是把排序想像成水里的水泡,小的在上面,大的在下面
相邻的两个元素比较,如果前面的比后面的大,就交换。
如有一组数据:3,6,2,1,9
->3,2,1,6,9
->2,1,3,6,9
->1,2,3,6,9
int main() { int a[] = {3,6,2,1,9}; for (int i = 0; i < sizeof(a)/4; i++) { for (int j = 0; j < sizeof(a)/4 - i - 1; j++) { if (a[j]>a[j + 1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } for (int i = 0; i < sizeof(a)/4; i++) { printf("%d ", a[i]); } cin.get(); }
时间复杂度:如果已经是排好的则记录移动次数为n-1,移动数据为0,最好的复杂度为O(N);若文件为反序(最坏)排序为N-1次,每次
排序需要进行N-1次比较,还要进行三次的数据交换。复杂度为O(N2)。空间复杂度为O(1)冒泡排序是一种稳定的排序.
优化:
可以添加一个标志位,如果数据进行了交换则将标记置为flase.如果标记一直为ture则说明,没有交换数据,已经排好序
int main() { int a[] = {3,6,2,1,9}; bool flage = true; for (int i = 0; i < sizeof(a)/4; i++) { for (int j = 0; j < sizeof(a)/4 - i - 1; j++) { if (a[j]>a[j + 1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; flage = false; } } if(flage) break; } for (int i = 0; i < sizeof(a)/4; i++) { printf("%d ", a[i]); } cin.get(); }