程序員必備排序之冒泡排序、快速排序

上篇講了插入排序本篇講交換排序,所謂交換排序便是根據序列中倆個元素關鍵字的比較結果來對換這倆個記錄在序列中的位置。

各排序算法的比較:


二、交換排序

2.1冒泡排序

1、基本思想:假設待排序表長爲N,從後往前(或從前往後)倆倆比較相鄰元素的值,若爲逆序則交換它們直到序列比較完,稱爲一趟冒泡。最多經過N-1趟冒泡就能把所有元素排序完。
2、代碼實現(優化版):
package sort;

public class BubbleSort {
		public BubbleSort(int[] a){
			boolean falg ;		
			for(int i=0;i<a.length-1;i++){
				falg = false;					//表示本趟排序是否發生過的標誌
				for(int j=a.length-1;j>i;j--){	        //一趟冒泡的過程
					if(a[j]<a[j-1]){			//若爲逆序
						int temp = a[j];		//交換
						a[j]=a[j-1];
						a[j-1]=temp;
						falg = true;
					}
				}
				if(!falg)	return ;			//本趟遍歷後未發生交換,則爲有序
			}
		}
		private void print(int[] a){
			for(int i=0;i<a.length;i++){
				System.out.print(a[i]+",");
			}
		}
		public static void main(String[] args){
			int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35};
			BubbleSort bu = new BubbleSort(a);
			bu.print(a);
		}
}

2.2快速排序

1、基本思想:快速排序是基於分治策略,在待排序的表中選擇任意一元素p作爲基準。將比p大的元素移動到p後,將比p小的元素移動到p之前,則p放在了其最終的位置上,再對前後倆子表分別重複上述操作即可。
2、代碼實現:
package sort;

public class QuickSort {

	public void  QuickedSort(int[] a,int low,int high){
		if(low<high){					//遞歸跳出的條件
			int pivotpos = Partition(a,low,high);	//將表劃分爲滿足上述條件的倆個子表
			QuickedSort(a,low,pivotpos-1);		//依次對倆個子表進行遞歸排序
			QuickedSort(a,pivotpos+1,high);
		}
	}

	private int Partition(int[] a, int low, int high) {
		int pivot = a[low];				//將當前表的第一個元素設爲樞紐值對錶進行劃分
		while(low<high){									
			while(low<high&&a[high]>=pivot)		high--;
			a[low]=a[high];				//比樞紐小的值移動到左邊
			while(low<high&&a[low]<=pivot)		low++;
			a[high]=a[low];				//比樞紐大的值移動到右邊
		}
		a[low]=pivot;						//樞紐元素存放到最終位置
		return low;						//返回存放樞紐的最終位置
	}
	private void print(int[] a){
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+",");
		}
	}
	public static void main(String[] args){
		int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35};
		QuickSort quicksort = new QuickSort();
		quicksort.QuickedSort(a,0,a.length-1);
		quicksort.print(a);
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章