1. 程式人生 > >排序演算法--交換篇(冒泡,快排)

排序演算法--交換篇(冒泡,快排)

1.氣泡排序

演算法思想:反覆掃描待排序記錄序列,在掃描的過程中順次比較相鄰的兩個元素的大小,若逆序就交換位置。第一趟排序不斷地將相鄰兩個記錄中關鍵字大的記錄向後移動,第二趟將前n-1個記錄進行同樣的操作,結果次大的記錄被放在n-1個記錄的位置。如此反覆,每趟排序都將一個記錄排序到位,直到剩下一個最小的記錄。

	private static void BubbleSort(int[] a) {
		int temp=0;
		for (int i = 0; i < a.length-1; i++) {
			for (int j = 0; j < a.length-i-1; j++) {
				if(a[j]>a[j+1]){
					temp=a[j];
					a[j]=a[j+1];
					a[j+1]=temp;
				}
				
			}
			
		}
		
	}

演算法分析:例如陣列[48,62,35,77,55,14,35,98,22,40],第一趟後[48,35,62,55,14,35,77,22,40,98],第二趟後[35,48,55,14,35,62,22,40,77,98],第三躺[35,48,14,35,55,22,40,62,77,98],第四趟[35,14,35,48,22,40,55,62,77,98],第五趟[14,35,35,22,40,48,55,62,77,98],第六趟[14,35,,22,35,40,48,55,62,77,98],最後[14,22,35,35,40,48,55,62,77,98]

時間複雜度O(n^2)    空間複雜度O(1)    穩定

2.快速排序

演算法思想:從待排序記錄序列中選取一個記錄(通常取第一個)為樞軸,其關鍵字K1,然後將其餘關鍵字小於k1的記錄移到前面,大於的數字放在後面,結果將待排序記錄序列分為兩個子表,最後將關鍵字為K1的記錄插到其分界線的位置。

	private static void QKSort(int[] a,int low,int high) {
		int pos;
		if(low<high){
			pos=QKPass(a,low,high);
			QKSort(a,low,pos-1);
			QKSort(a,pos+1,high);
		}
	}
	//一趟快速排序
	private static int QKPass(int[] a, int low, int high) {
		int x=a[low];//選擇基準位置
		while(low<high){
			while(low<high&&a[high]>x)
				high--;//high從右到左找小於x的記錄
			if(low<high){//找到小於x的記錄,則送入空單元a[low]
				a[low]=a[high];
				low++;
			}
			while(low<high&&a[low]<x)//low從左到右找大於x的記錄
				low++;
			if(low<high){//找到大於x的記錄,則送入空單元a[high]
				a[high]=a[low];
				high--;
			}
		}
		a[low]=x;//將基準記錄儲存到low=high的位置
		
		return low;//返回基準記錄的位置
	}

演算法分析:例如序列{48,62,35,77,55,14,35,98}

一次劃分後:{35,14,35}48{55,77,62,98}分別進行快速排序

第二次劃分:{14} 35 {35} 48  55{62}77{98}

快速排序遞迴演算法的執行過程對應一棵二叉樹,理想情況下是一棵完全二叉樹,遞迴工作棧的大小與上述遞迴呼叫二叉樹的深度對應,平均情況下輔助空間複雜度為O(log2n)      時間複雜度O(nlog2n)      不穩定