數據結構學習(十五)——冒泡排序

在前篇的選擇排序中,n個數據最多進行n-1次交換,但每次交換前要進行大量比較操做來肯定交換對象,比較次數遠大於交換次數。而交換操做只是數據的讀寫,數據規模較小時,其工做量比比較工做量小。用增長交換的次數來減小比較次數有多是合理的,因此冒泡排序的好處是以交換爲主要手段。若是排序對象基本有序時,冒泡排序算法將具備較高的效率。這是由於冒泡排序中有個標誌變量是用於提早終止排序的,也即排序能夠半途終止。算法

下面的代碼進行了冒泡排序的練習。code

#include <stdio.h>

#define MAXSIZE 50

void Bubble_sort(int *s, int n);
int main(void)
{
	int n, i;
	int s[MAXSIZE + 1];

	printf("冒泡排序練習\n");
	printf("輸入排序數據個數:");
	scanf("%d", &n);
	getchar();
	printf("依次輸入數據\n");
	for(i=1; i<=n; i++)
		scanf("%d", &s[i]); 

	Bubble_sort(s, n);

	printf("排序後的數據爲\n");
	for(i=1; i<=n; i++)
		printf("%d ", s[i]);
	printf("\n");
 
	return 0;
}


void Bubble_sort(int *s, int n)
{
	int i, j, k;
	int flag = 0;	//交換標誌變量

	for(i=1; i<=n; i++)
	{
		flag = 1;
		for(j=n; j>i; j--)			//從後向前查找最小值
		{
			if(s[j] < s[j-1])
			{
				s[0] = s[j];
				s[j] = s[j-1];
				s[j-1] = s[0];
				flag = 0;
			}
		}
		if(flag)					//已經有序,提早終止排序
			break;
	}
}

冒泡排序算法的時間複雜度爲O(n^2)。

其算法操做有兩部分,一種是比較操做,一種是交換操做。冒泡排序能夠進行靜態排序,但效率不高。也能夠動態排序,但工做量比插入算法大一些(交換次數多一些)。最適合半動態排序,即每生成若干數據排序一次。對象

該算法須要的資源也比較少,只須要一個備用單元和3個輔助變量。排序

相關文章
相關標籤/搜索