1. 程式人生 > >交換類排序-----氣泡排序

交換類排序-----氣泡排序

氣泡排序:

//氣泡排序
# include<stdio.h>//時間複雜度 O(n^2) 穩定 
void BubbleSort(int a[], int n){
	for(int i = 1; i <= n; i++) //每一趟結束都把一個最大的數放到最下面 
	    for(int j = 1; j <= n-i; j++)
	     if(a[j] > a[j+1]){
		   int t = a[j];
		   a[j] = a[j+1];
		   a[j+1] = t;
		} 
} 


int main(){
	int n;
	printf("請輸入你要排序的數的個數:"); 
	scanf("%d", &n);
	int *a = new int[n];//申請一個整型變數空間,沒有賦初值,並定義一個整型指標a指向該地址空間 
	for(int i = 1; i <= n; i++)
	scanf("%d", &a[i]);
	BubbleSort(a, n);
	printf("排序後:"); 
	for(int j = 1; j <= n; j++)
	printf("%6d", a[j]);
	delete []a;//回收陣列a的空間 
	return 0;
} 

氣泡排序改進1:

//氣泡排序--改進1新增標誌位,如果某一次排序中出現沒有交換位置,說明排序完成 
# include<stdio.h>
void BubbleSort(int a[], int n){
	int flag = 0;    //初始化表示沒有交換 
	for(int i = 1; i <= n; i++){    //每一趟結束都把一個最大的數放到最下面
	flag = 0;
	for(int j = 1; j <= n-i; j++)
	     if(a[j] > a[j+1]){
		   int t = a[j];
		   a[j] = a[j+1];
		   a[j+1] = t;
		   flag = 1; //表示已經交換過了 
		} 
		if(flag == 0) break;//一趟冒泡完成以後,若flag=0,則已經有序 ,跳出迴圈 
	}	    
} 


int main(){
	int n;
	printf("請輸入你要排序的數的個數:"); 
	scanf("%d", &n);
	int *a = new int[n];//申請一個整型變數空間,沒有賦初值,並定義一個整型指標a指向該地址空間 
	for(int i = 1; i <= n; i++)
	scanf("%d", &a[i]);
	BubbleSort(a, n);
	printf("排序後:"); 
	for(int j = 1; j <= n; j++)
	printf("%6d", a[j]);
	delete []a;//回收陣列a的空間 
	return 0;
}  

氣泡排序改進2:

/*氣泡排序--改進2,新增標誌位,記錄最後一次交換位置的地方,證明最後一次
交換位置後的地方是排好序的,下一次只需要排最後一次之前的地方就好*/ 
# include<stdio.h>
void BubbleSort(int a[], int n){
	int flag = n-1; //剛開始,最後交換位置的地方設定為陣列的最後一位  
    while(flag > 1){   //flag在逐漸減小,到最後肯定會變為1 
        int pos = 1; //每一輪的最開始,標誌位置在陣列1 
    	for(int i = 1; i <= flag; i++)//第一趟要比n-1次
	     if(a[i] > a[i+1]){
		   int t = a[i];
		   a[i] = a[i+1];
		   a[i+1] = t;
		   pos = i;   //pos記錄最後一次交換位置的地方,pos往後的數都是有序的
		} 
		flag = pos;//因為氣泡排序是每次把最大的數沉到最底部,當下一趟排序遇到之前標記的位置pos時就可以不用再冒泡了
    }
}


int main(){
	int n;
	printf("請輸入你要排序的數的個數:"); 
	scanf("%d", &n);
	int *a = new int[n];//申請一個整型變數空間,沒有賦初值,並定義一個整型指標a指向該地址空間 
	for(int i = 1; i <= n; i++)
	scanf("%d", &a[i]);
	BubbleSort(a, n);
	printf("排序後:"); 
	for(int j = 1; j <= n; j++)
	printf("%6d", a[j]);
	delete []a;//回收陣列a的空間 
	return 0;
}