天天看點

冒泡排序法及改進

  • 對n個數字組成的序列需要n-1趟冒泡排序;
  • 每一趟定位資訊,都會确定一有序個記錄;
  • 以此類推到最後直到最後會把所有的記錄進有序數組當中;

1、從下标1開始計數排序

#include <stdio.h>
#include <stdlib.h>
void Bubble_Sort(int array[],int n){//多少個元素 
  int i,j,k,temp;
  for(i=1;i<=n-1;i++){//n個數字排序,隻用進行n-1趟周遊 
    for(j=1;j<=n-i;j++){//從第一位開始周遊,直到最後一個尚未歸位的數,n-i 
      if(array[j]>array[j+1]){
        temp = array[j];
        array[j] = array[j+1];
        array[j+1] = temp;
      }
    }
  } 
}
void DisPlay(int array[],int n){
  int i;
  for(i=0;i<=n;i++){
    printf("%d ",array[i]);
  }
  printf("\n");
} 
int main() {
  int array[11] = {0,43,12,35,18,26,57,7,21,43,46};//數字從下标1開始 
  DisPlay(array,10);
  Bubble_Sort(array,10);
  DisPlay(array,10);
  return 0;
}      
void Bubble_Sort(int array[],int n){//多少個元素 
  int i,j,k,temp;
  for(i=0;i<n-1;i++){//n個數字排序,隻用進行n-1趟周遊 
    for(j=0;j<n-1-i;j++){//從第一位開始周遊,直到最後一個尚未歸位的數,n-i 
      if(array[j]>array[j+1]){
        temp = array[j];
        array[j] = array[j+1];
        array[j+1] = temp;
      }
    }
  } 
}
void DisPlay(int array[],int n){//n為元素個數 
  int i;
  for(i=0;i<n;i++){
    printf("%d ",array[i]);
  }
  printf("\n");
} 
int main() {
  int array[11] = {29,43,12,35,18,26,57,7,21,43,46};//數字從下标1開始 
  DisPlay(array,11);
  Bubble_Sort(array,11);
  DisPlay(array,11);
  return 0;
}      
  • 一旦發現某一趟沒有進行交換操作,那麼表明此時排序已經完成,不要在進行沒有必要的冒泡排序。提前結束循環
void Bubble_Sort(int array[],int n){//多少個元素 
  int i,j,k,temp,exchange;
  for(i=1;i<=n-1;i++){//n個數字排序,隻用進行n-1趟周遊 
    exchange = 0;
    for(j=1;j<=n-i;j++){//從第一位開始周遊,直到最後一個尚未歸位的數,n-i 
      if(array[j]>array[j+1]){
        temp = array[j];
        array[j] = array[j+1];
        array[j+1] = temp;
        exchange = 1;
      }
    }
    if(exchange == 0){
      break;
    }
  } 
}