幾種基本的排序算法實現

package com.hpe.test;
import java.util.Arrays;

public class Sort {
	
	public static void main(String[] args) {
		int arr[] = {3,5,2,6,1,4};
		// 選擇排序
		//selectSort(arr);
		//System.out.println("選擇排序結果:"+Arrays.toString(arr));
		// 插入排序
		//insertSort(arr);
		//System.out.println("插入排序結果:"+Arrays.toString(arr));
		// 歸併排序
		//mergeSort(arr, 0, arr.length-1);
		//System.out.println("歸併排序結果:"+Arrays.toString(arr));
		// 希爾排序
		//shell(arr);
		//System.out.println("希爾排序結果:"+Arrays.toString(arr));
		// 快速排序
		quicksort(arr,0,arr.length-1);
		System.out.println("快速排序結果:"+Arrays.toString(arr));
	}
	
	// 快速排序
	private static void quicksort(int[] a, int left, int right) {
		if(left > right){
			return;
		}
		int i = left;
		int j = right;
		int x = a[i];
		while(i < j){
			while(a[j] >= x && i < j){
				--j;
			}
			if(i < j){
				a[i] = a[j];
			}
			while(a[i] < x && i < j){
				++i;
			}
			if(i < j){
				a[j] = a[i];
			}
		}
		// 基準點到最終位置上
		a[i] = x;
		// 對左右進行遞歸排序
		quicksort(a, left, i-1);
		quicksort(a, i+1, right);
	}

	// 希爾排序
	public static void shell(int []a){
		// n表示數組長度
		int n = a.length;
		for(int i = n/2;i >= 1;i = i/2){// 步長的變化
			for(int j = 0;j+i < n;++j){
				// 內部進行插入排序
				if(a[j+i] < a[j]){
					int x = a[j+i];
					int k = j + i;
					for(;k-i >= 0;k = k-i){
						if(a[k] < a[k-i]){
							a[k] = a[k-i];
						}else{
							a[k] = x;
							break;
						}
					}
					if(k-i < 0){
						a[k] = x;
					}
				}
			}
		}
	}
	
	// 歸併排序
	public static void mergeSort(int []a,int left,int right){
		// 一定要寫此處的遞歸結束條件!!!!!!!!
		if(left < right){
			int mid = (left + right) / 2;
			mergeSort(a, 0, mid);
			mergeSort(a, mid+1, right);
			merge(a, left, right);
		}
		
	}
	// 歸併合併
	public static void merge(int []a,int left,int right){
		int i = left;
		int mid = (left + right)/2;
		int j = mid + 1;
		int k = 0;
		int n = right - left +1;
		int []b = new int[n];
		while(i <= mid && j <= right){
			if(a[i] <= a[j]){
				b[k++] = a[i++];
			}else{
				b[k++] = a[j++];
			}
		}
		while(i <= mid){
			b[k++] = a[i++];
		}
		while(j <= right){
			b[k++] = a[j++];
		}
		i = left;
		for(j = 0;j < n;++j){
			a[i+j] = b[j];
		}
		
	}
	
	// 插入排序
	public static void insertSort(int []a){
		if(a.length <= 1){
			return;
		}
		for(int i = 1;i <= a.length-1;++i){
			if(a[i] < a[i-1]){
				// 保存元素
				int x = a[i];
				// 尋找插入位置
				for(int j = i-1;j >= 0;--j){
					if(x < a[j]){
						a[j+1] = a[j];
					}else{
						a[j+1] = x;
						break;
					}
					if(j == 0){
						a[0] = x;
					}
				}
			}
		}
	}
	
	// 選擇排序
	public static void selectSort(int []a){
		if(a.length <= 1){
			return;
		}
		for(int i = 0;i < a.length;++i){
			// 找最小
			int min = i;
			for(int j = i+1;j < a.length;++j){
				if(a[j] < a[min]){
					min = j;
				}
			}
			// 交換
			if(min != i){
				int t = a[i];
				a[i] = a[min];
				a[min] = t;
			}
		}
	}
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章