1. 程式人生 > >氣泡排序的改進演算法和快速排序

氣泡排序的改進演算法和快速排序

氣泡排序的基本思想

  氣泡排序和快速排序的效能分析:

              平均情況    最好情況   最壞情況        穩定性
氣泡排序  o(n^2)        o(n)         o(n^2)       穩定
快速排序  o(n*logn)   o(n*logn)      o(n^2)       不穩定

  .從最好情況來看氣泡排序比快速排序效能更好,也就是說如果你的排序元素基本有序,你應該考慮的就是氣泡排序

  .從平均情況來看,快速排序反而優於氣泡排序.

  .從根本上來說快速排序就是氣泡排序的一種優化.

首先先給出程式的測試程式碼:

int main()
{
	printf("請輸入5個你要比較的資料:");
	for(i=0;i<sz;i++)
	{
		scanf("%d",&arr[i]);
	}
	quick_sort(arr,0,sz-1);
	for(i=0;i<sz;i++)
	{
		printf("%d ",arr[i]);
	}
	system("pause");
	return 0;
}

       .氣泡排序的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序就交換,如果沒有則繼續比較直到比較完成

       .在程式中我們用雙重的for迴圈來控制實現,一個變數i控制比較的趟數,一個變數j控制每趟比較的次數

       .如果有n個數字需要比較,那仫我們就需要比較(n-1)趟,每一趟我們需要比較(n-1-i)次

       .但是如果排序是降序排列,而給出的待排序的元素為  0,9,8,7,6,5,4,3,2,1,我們發現只要將第一個數字交換到陣列末位置就可以了,那仫氣泡排序的每次比較就成為多餘的了,雖然它的比較成立的次數很少,如果我們新增一個標誌位,用來判斷條件是否成立,如果元素本身就是有序的就直接跳出

       下面我們就來實現優化之後的氣泡排序

void bubble_sort(int arr[],int sz)
{
	int flag=1;  //新增標誌位
	for(i=0;i<sz-1;i++)  //控制比較的趟數
	{
		flag=1;
		for(j=0;j<sz-1-i;j++)  //控制每趟比較的次數
		{
			if(arr[j] < arr[j+1])  //降序排列
			{
				int tmp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=tmp;
				flag=0;
			}
		}
		if(flag == 1) break;
	}
}

快速排序的基本思想

     先選擇一個待排序的元素中的一個做為軸樞(一般選擇第一個元素),通過一趟快速排序將元素分成兩個獨立的部分,一部分均比軸樞小,一部分均比軸樞大,然後分別再對這兩部分進行快速排序,以達到整個有序的目的.

     下面我們來看一組元素的快速排序過程.

   

   快速排序的實現:

int Partition(int *arr,int left,int right)   //快速排序實現升序排序資料
{
	int key=arr[left];  
	while(left < right)
	{
		while(left < right && arr[right] >= key)  //從元素右面查詢第一個比軸樞小的元素
		{
			--right;
		}
		arr[left]=arr[right];
		while(left < right && arr[left] <= key) //從元素左面查詢第一個比軸樞大的元素
		{
			++left;
		}
		arr[right]=arr[left];
	}
	return left;
}

void quick_sort(int arr[],int left,int right)  
{
	int key=0;  
	if(left < right)
	{
		key=Partition(arr,left,right);  //軸樞key
		quick_sort(arr,left,key-1);  //位於軸樞左面的數字進行排序
		quick_sort(arr,key+1,right);  //位於軸樞右面的數字進行排序

	}
}

   以上就是我個人對氣泡排序和快速排序的理解,如果有不對和需要優化的地方希望大家指出。

  看完了記得點評奧吐舌頭