前言
关于排序
正文
借此回顾一下冒泡排序
题目
编写双向冒泡程序,第一趟把数字大的放后面,第二趟把数字小的放前面,往复直到排序完成
low,high两个工作指针,一个从头部遍历,一个从尾部遍历,当相遇时或flag=0时排序完成。
先从前往后冒泡排序,把数字大的放在后面,high–
然后从后往前冒泡排序,把数字小的放在前面,low++
void BubbleSort(int a[],int n){
int low=0,high=n-1;
int i,j,flag=1;
while(low<high&&flag){
flag=0;
for(i=low;i<high;i++){
if(a[i]>a[i+1]){
swap(a[i],a[i+1]);//交换
flag=1;
}
}
high--;
for(j=high;j>low;j--){
if(a[j]<a[j-1]){
swap(a[j],a[j-1]);//交换
flag=1;
}
}
low++;
}
}
冒泡排序的稳定性:顺序两两交换,当遇到比其大的元素时才交换,所以相同元素的相对位置能保持不变,故稳定
冒泡排序空间效率:O(1)
冒泡排序时间效率:最好情况是当初始序列有序时,比较次数为n-1,没有移动元素,此时时间复杂度为O(n)。最坏情况是当初始序列为逆序时,比较次数为n(n-1)/2,移动次数为3比较次数即3n(n-1)/2,此时时间复杂度为O(n2)。