在每一趟比较结束后,若从某个位置r开始,不在进行记录交换,就说明从A[r+1]到A[n-1]已经排好序,从而下一趟比较只要进行到位置r就行了。若某一趟没有元素交换,则算法结束。
改进后的算法如下,每次只记录最后一次交换的位置:
- void Bubble(int *Array, int n)
- {
- int bound=n;
- int m,i;
- int a;
- while(bound != 0){
- m = 0;
- for(i = 0; i < bound; i++){
- if(*(Array+i) > *(Array+i+1)){
- a = *(Array+i);
- *(Array+i) = *(Array+i+1);
- *(Array+i+1) = a;
- m = i;
- }
- }
- bound = m; //记录发生最后一次交换的位置
- }
- }
前面所看到的都是单向冒泡,经过一趟大气泡沉底或轻气泡上浮。为了提高效率,可以使用双向冒泡,即大气泡下沉的同时,也使轻气泡上浮。此为双向冒泡排序算法.
双向冒泡算法:
- void TwoBubble(int *Araay, int n)
- {
- int boundmin = 0;
- int boundmax = n;
- int min, max, i, a;
- while(boundmin < boundmax){
- mmin=0;
- max=0;
- for(i = boundmin; i < boundmax; i++){
- if(*(Array+i) > *(Array+i+1)){
- a = *(Array+i);
- *(Array+i) = *(Array+i+1);
- *(Array+i+1) = a;
- max = i; #记录下沉最后一次交换的位置
- }
- }
- if(max == 0)
- break;
- boundmax = max;
- for(i = boundmax-1; i > boundmin; i--){
- if(*(Array+i) < *(Array+i-1)){
- a = *(Array+i);
- *(Array+i) = *(Array+i-1);
- *(Array+i-1) = a;
- min = i; #记录上升最后一次交换的位置
- }
- }
- if(min == 0)
- break;
- boundmin = min;
- }
- }
阅读(1845) | 评论(2) | 转发(2) |