1. 程式人生 > >1.交換排序(氣泡排序和快速排序)

1.交換排序(氣泡排序和快速排序)

交換排序的基本思想:兩兩比較關鍵字,當兩個記錄的次序相反時進行交換,直到完成排序為止。

(1)氣泡排序

基本思想:相鄰關鍵字間的比較和位置的交換,使關鍵字最小的記錄如氣泡一般逐漸往上“漂浮”直至“水面”。

void BubbleSort(int a[],int size)//氣泡排序
{
	for (int i=0;i<size;i++)
	{
		for (int j=0;j<size-i;j++)//比較找出本趟最小關鍵字
		{
			if (a[j]>a[j+1])
			{
				a[j] ^= a[j+1];//交換,小的關鍵字上移
				a[j+1] ^= a[j];
				a[j] ^= a[j+1];
			}
		}
	}
}
氣泡排序是一個穩定的排序演算法,該演算法平均的時間複雜度是O(n^2)。

2.快速排序

基本思想:快速排序是由氣泡排序改進而得,採用一種分而治之的思想。在待排序的n個記錄中任取一個記錄(通常取第一個記錄),把該記錄放入適當位置後,資料序列被此記錄劃分成兩部分,所有關鍵字比該記錄關鍵字小的記錄放置在前一部分,所有比它大的記錄放置在後一部分,並把該記錄排在這兩部分的中間,此過程被稱為快速排序。簡而言之,每趟使表的第一個元素放入適當位置,將表一分為二,對子表按遞迴方式繼續這種劃分,直至劃分的子表長為0或1。

void QuickSort(int a[],int s,int t)
{
	int i = s,j = t;

	int temp=a[s];						//以第一個元素為基準值
	if (s<t)
	{
		while (i != j)					//從區間兩端交替向中間掃描,直至i=j為止。
		{
			while (i<j && a[j]>temp)	//從右向左掃描,找到第一個小於基準值的元素。	
			{
				j--;
			}
			a[i] = a[j];				//找到該元素後,交換a[i]<->a[j].
			while (i<j && a[i]<temp)	//從右向左掃描,找到第一個小於基準值的元素。
			{
				i++;
			}
			a[j]=a[i];					//找到該元素後,交換a[i]<->a[j].
		}
		a[i]=temp;						//找到基準值賦值到中間位置。比它小的在左側,比它大的在右側。
		QuickSort(a,s,i-1);				//對左區間遞迴排序
		QuickSort(a,i+1,t);				//對右區間遞迴排序
	}
}
快速排序是一個不穩定的排序演算法,該演算法平均的時間複雜度是O(nlogn)。