兩種交換排序代碼實現(冒泡排序+快速排序【可多種方式優化】)

交換排序

1、冒泡排序

2、快速排序【可多種方式優化】


交換排序

1、冒泡排序

afsaf

package sort;

public class BubbleSort {
	
	//普通冒泡排序
	public static void sortA(int[] arr,int n){
		int tmp;//臨時變量
		int compare=0;//比較趟數
		int count=0;//比較次數
		int change=0;//交換位置次數
		for(int i=0;i<n-1;i++){
			compare++;
			for(int j=n-1;j>i;j--){//冒泡排序,從後往前
				count++;
				if(arr[j-1]>arr[j]){
					change++;
					tmp=arr[j-1];
					arr[j-1]=arr[j];
					arr[j]=tmp;
				}
			}
		}
		System.out.println("比較趟數"+compare);
		System.out.println("比較次數"+count);
		System.out.println("交換位置次數"+change);
	}

	
	//改進後的冒泡排序
	public static void sortMore(int[] arr,int n){
		int tmp;//臨時變量
		int compare=0;//比較趟數
		int count=0;//比較次數
		int change=0;//交換位置次數
		boolean flag=true;
		for(int i=0;i<n-1;i++){
			compare++;
			
			flag=false;
			for(int j=n-1;j>i;j--){//冒泡排序,從後往前
				count++;
				
				if(arr[j-1]>arr[j]){
					change++;
					tmp=arr[j-1];
					arr[j-1]=arr[j];
					arr[j]=tmp;
					flag=true;//某一趟中存在元素的交換,說明未排好序
				}
			}
			//判斷是否還存在比較的情況
			if(!flag){//某一趟中不存在元素的交換,說明已經排好序了
				break;//結束for循環
			}
//			if(flag==false){
//				break;//結束for循環
//			}
//			System.out.println("比較ing..");
		}
		System.out.println("比較趟數"+compare);
		System.out.println("比較次數"+count);
		System.out.println("交換位置次數"+change);
	}
	
	public static void main(String[] args) {
		//普通冒泡排序
		int  arr[]={4,5,6,3,1,9,0,8,7,2};
		sortA(arr,arr.length);
		System.out.println("排序後:");
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}
		System.out.println("\n------------------------------------------");
		
		//改進後的冒泡排序
		int  arr2[]={4,5,6,3,1,9,0,8,7,2};
		sortMore(arr2,arr2.length);
		System.out.println("排序後:");
		for(int i=0;i<arr2.length;i++){
			System.out.print(arr2[i]+" ");
		}
		
	}
}

2、快速排序【優化】

package sort;

//快速排序
public class QuickSort {

	//交換兩個元素的值
	public static void swap(int[] arr,int low,int high){
		int temp=arr[low];
		arr[low]=arr[high];
		arr[high]=temp;
	}
	
	//確立基本點+排序
	public static int partition(int[] arr,int low,int high){
		int point=low;//基本點的值
		
		//目標   基本點  ,左邊的值,都比arr[point]小; 右邊的值,都比arr[point]大
		while(low<high){
			//右邊掃描,小的值,交換操作
			while(low<high && arr[point]<arr[high]){
				high--;//從右邊開始掃描,過濾比arr[point]大的值,知道遇到比arr[point]小的值
			}
			swap(arr,point,high);//交換元素位置
			point=high;//大值位置【point記錄--交換後的位置】
			
			//左邊掃描,打的值,交換操作
			while(low<high && arr[point]>arr[low]){
				low++;
			}
			swap(arr,low,point);//交換元素位置
			point=low;//小值位置【point記錄--交換後的位置】
		}
		return point;//【point記錄--交換後的位置】
	}
	
	
	public static void sort(int[] arr,int low,int high){
		if(low<high){//循環終止條件
			
			//確立基本點,進行排序【小於基本點的,放左邊,大於基本點的,放右邊】
			int point=partition(arr,low,high);
			
			sort(arr,low,point-1);//左邊遍歷
//			sort(arr,low,point);//左邊遍歷
			sort(arr,point+1,high);//右邊遍歷
		}
	}
	
	
	
	public static void main(String[] args) {
		int i;
		int a[] = { 5, 2, 6, 0, 3, 9, 1, 7, 4, 8 };

		sort(a, 0,a.length-1);

		System.out.println("快速排序--排序後的結果是:");
		for (i = 0; i < 10; i++) {
			System.out.print(a[i] + " ");
		}
		System.out.println("\n");

	}

}




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