1. 程式人生 > >6、八大內部排序--Java程式碼

6、八大內部排序--Java程式碼

八大內部排序:


一、直接插入排序:


package algorithm.sort;

/**
 * 插入排序之直接插入排序
 * @author baolibin
 */
public class _04_insertSort {
	public static void main(String[] args) {
		int[] tmpNum={54,23,8,87,56,21,34,17,6,23,4};
		insertSort insertSort = new insertSort(tmpNum);
		insertSort.insert_Sort();
		insertSort.fnPrint();
	}
}
class insertSort{
	private int[] tmpNum;
	public insertSort(int[] tmpNum){
		this.tmpNum=tmpNum;
	}
	/**
	 * 直接插入排序
	 */
	public void insert_Sort(){
		int tmp=0,j=0;
		for (int i = 1; i < tmpNum.length; i++) {
//			fnPrint();
			tmp=tmpNum[i];
			j=i;
			while (j>0&&tmpNum[j-1]>tmp) {
				tmpNum[j]=tmpNum[j-1];
				j--;
			}
			tmpNum[j]=tmp;
		}
	}
	/**
	 * 列印函式
	 */
	public void fnPrint(){
		for (int i = 0; i < tmpNum.length; i++) {
			if (i==tmpNum.length-1) {
				System.out.println(tmpNum[i]);
			}else {
				System.out.print(tmpNum[i]+"、");
			}
		}
	}
}

二、希爾排序:


package algorithm.sort;
/**
 * 插入排序之希爾排序
 * @author baolibin
 */
public class _06_shellSort {
	public static void main(String[] args) {
		int[] tmpNum={54,23,8,87,56,21,34,17,6,23,4};
		shellSort shellSort = new shellSort(tmpNum);
		shellSort.shell_Sort();
		shellSort.fnPrint();
	}
}
class shellSort{
	private int[] tmpNum;
	public shellSort(int[] tmpNum){
		this.tmpNum=tmpNum;
	}
	/**
	 * 希爾排序
	 */
	public void shell_Sort(){
		int step=tmpNum.length/2;
		while (1<=step) {
			this.fnPrint();
			//遍歷所有得的組
			for (int i = step; i < tmpNum.length; i++) {
				int j=i-step;
				//儲存要插入的資料
				int tmp=tmpNum[i];
				while(j>=0&&tmp<tmpNum[j]){
					tmpNum[j+step]=tmpNum[j];
					j=j-step;
				}
				tmpNum[j+step]=tmp;
			}
			step=step/2;
		}
	}
	/**
	 * 列印函式
	 */
	public void fnPrint(){
		for (int i = 0; i < tmpNum.length; i++) {
			if (i==tmpNum.length-1) {
				System.out.println(tmpNum[i]);
			}else {
				System.out.print(tmpNum[i]+"、");
			}
		}
	}
}

三、簡單選擇排序:


package algorithm.sort;
/**
 * 選擇排序之簡單選擇排序
 * @author baolibin
 */
public class _05_selectSort {
	public static void main(String[] args) {
		int[] tmpNum={54,23,8,87,56,21,34,17,6,23,4};
		selectSort selectSort = new selectSort(tmpNum);
		selectSort.select_Sort();
		selectSort.fnPrint();
	}
}
class selectSort{
	private int[] tmpNum;
	public selectSort(int[] tmpNum){
		this.tmpNum=tmpNum;
	}
	/**
	 * 簡單選擇排序
	 */
	public void select_Sort(){
		int tmp=0,index=0;
		for (int i = 0; i < tmpNum.length-1; i++) {
			index=i;
			for (int j = i+1; j < tmpNum.length; j++) {
				if(tmpNum[index]>tmpNum[j]){
					index=j;
				}
			}
			tmp=tmpNum[i];
			tmpNum[i]=tmpNum[index];
			tmpNum[index]=tmp;
		}
	}
	/**
	 * 列印函式
	 */
	public void fnPrint(){
		for (int i = 0; i < tmpNum.length; i++) {
			if (i==tmpNum.length-1) {
				System.out.println(tmpNum[i]);
			}else {
				System.out.print(tmpNum[i]+"、");
			}
		}
	}
}

四、堆排序:




package algorithm.sort;
/**
 * 選擇排序之堆排序
 * @author baolibin
 * 
 * 參考網址:
 * http://www.cnblogs.com/jingmoxukong/p/4303826.html
 * http://www.cnblogs.com/mengdd/archive/2012/11/30/2796845.html
 */
public class _02_heapSort {
	public static void main(String[] args) {
		int[] tmpNum={32,5,76,9,23,43,12,4,56}; //宣告的靜態陣列
		heapSort heapsort=new heapSort(tmpNum);
		heapsort.heapScheduler(tmpNum);
		heapsort.sortPtint();
	}
}
class heapSort{
	private int[] tmpNum;
	public heapSort(int[] tmpNum){
		this.tmpNum=tmpNum;
	}
	/**進行堆調整
	 * @param tmpNum 陣列
	 * @param parent 選擇開始調整的父節點儲存的陣列下標
	 * @param length 待排序陣列的下標長度
	 */
	public void heapAdjust(int[] tmpNum,int parent,int length){
		//先儲存當前父節點的值
		int tmp=tmpNum[parent];
		//選取當前父節點的左孩子
		int child=2*parent+1;
		while(child<length){
			//選取右孩子的條件:存在右節點且右節點的值大於左節點的值
			if (child+1<=length&&tmpNum[child]<tmpNum[child+1]) {
				child++;
			}
			//當父節點的值大於孩子節點的時候,直接結束
			if (tmp>=tmpNum[child]) {
				break;
			}
			tmpNum[parent]=tmpNum[child];
			
			//從孩子節點的左孩子開始繼續往下篩選
			parent=child;
			child=2*child+1;
		}
		tmpNum[parent]=tmp;
	}
	
	public void heapScheduler(int[] tmpNum){
		//建堆
		//本程式建立大頂堆,保證所有的父節點都比孩子節點大
		for(int i=tmpNum.length/2;i>=0;i--){
			heapAdjust(tmpNum, i, tmpNum.length-1);
		}
		sortPtint();
		//進行排序
		int tmp=0;
		for (int i=tmpNum.length-1;i>0;i--) {
			//最後一個元素和第一個元素進行交換
			tmp=tmpNum[i];
			tmpNum[i]=tmpNum[0];
			tmpNum[0]=tmp;
			/**
			 按堆的定義將陣列R[0..n]調整為堆(這個過程稱為建立初始堆),交換R[0]和R[n];
			然後,將R[0..n-1]調整為堆,交換R[0]和R[n-1];
			如此反覆,直到交換了R[0]和R[1]為止。
			 */
			heapAdjust(tmpNum, 0, i);
			System.out.println("第"+(tmpNum.length-i)+"趟");
		}
	}
	/**
	 * 列印堆的資料
	 * 用陣列儲存的堆
	 */
	public void sortPtint(){
		for(int i=0;i<tmpNum.length;i++){
			if(i==tmpNum.length-1){
				System.out.print(tmpNum[i]);
			}else {
				System.out.print(tmpNum[i]+"、");
			}
		}
	}
}

五、氣泡排序:


package algorithm.sort;
/**
 * 交換排序之氣泡排序
 * @author baolibin
 */
public class _03_bubbleSort {
	public static void main(String[] args) {
		int[] tmpNum={54,23,8,87,56,21,34,17,6,23,4};
		bubbleSort bubbleSort = new bubbleSort(tmpNum);
		bubbleSort.bullble_Sort();
		bubbleSort.fnPrint();
	}
}
class bubbleSort{
	private int[] tmpNum;
	public bubbleSort(int[] tmpNum){
		this.tmpNum=tmpNum;
	}
	/**
	 * 氣泡排序函式
	 */
	public void bullble_Sort(){
		int tmp=0;
		for (int i = 0; i < tmpNum.length-1; i++) {
			for (int j = i+1; j < tmpNum.length; j++) {
				if(tmpNum[j]<tmpNum[i]){
					tmp=tmpNum[i];
					tmpNum[i]=tmpNum[j];
					tmpNum[j]=tmp;
				}
			}
		}
	}
	/**
	 * 列印函式
	 */
	public void fnPrint(){
		for (int i = 0; i < tmpNum.length; i++) {
			if (i==tmpNum.length-1) {
				System.out.println(tmpNum[i]);
			}else {
				System.out.print(tmpNum[i]+"、");
			}
		}
	}
}

六、快速排序:


package algorithm.sort;
/**
 * 8大內部排序演算法之一:交換排序之快速排序
 * author:baolibin
 */
public class _01_quickSort {
	public static void main(String[] args) {
		int[] tmpNum={32,12,76,3,9,26,72,9,2,54,3,23}; //待排序的陣列
		Sort sort=new Sort(tmpNum);
		sort.sortScheduler(0, tmpNum.length-1, tmpNum);
		sort.print();
	}
}

class Sort {
	private int[] sortTmp;
	public Sort(int[] sortTmp) {
		this.sortTmp = sortTmp;
	}
	/**
	 * 遞迴呼叫進行排序
	 * @param low 左指標
	 * @param hight 右指標
	 * @param tmpNum 陣列
	 */
	public void sortScheduler(int low, int hight,int[] tmpNum){
		if(low<hight){
			int middle=sortNum(0, hight, tmpNum);
			if(middle>0&&middle<hight){
				sortScheduler(0, middle-1, tmpNum);
				sortScheduler(middle+1, hight, tmpNum);
			}
		}
	}
	/**
	 * @param low 左指標
	 * @param hight 右指標
	 * @param tmpNum 陣列
	 * @return 基準元素插入的位置
	 */
	public int sortNum(int low, int hight, int[] tmpNum) {
		int tmp = tmpNum[low];
		while (low < hight) {
			while (low < hight && tmp <= tmpNum[hight]) {
				hight--;
			}
			tmpNum[low] = tmpNum[hight];
			while (low < hight && tmpNum[low] <= tmp) {
				low++;
			}
			tmpNum[hight] = tmpNum[low];
		}
		tmpNum[low] = tmp;
		return low;
	}
	/**
	 * 進行結果的列印
	 */
	public void print() {
		for (int i = 0; i < sortTmp.length; i++) {
			if(i==sortTmp.length-1){
				System.out.print(sortTmp[i]);
			}else{
				System.out.print(sortTmp[i] + "、");
			}
		}
	}
}


七、歸併排序:


package algorithm.sort;
/**
 * 歸併排序
 * @author baolibin
 */
public class _07_mergeSort {
	public static void main(String[] args) {
		int[] tmpNum={54,23,8,87,56,21,34,17,6,23,4};
		mergeSort mergesort = new mergeSort(tmpNum);
		mergesort.sortProgress();
		mergesort.fnPrint();
	}
}
class mergeSort {
	private int[] tmpNum;
	public mergeSort(int[] tmpNum) {
		this.tmpNum=tmpNum;
	}
	/**
	 * 歸併排序
	 * @param tmpNum 待排序的陣列
	 * @param low 第一段陣列的起始下標
	 * @param middle 第一段陣列的末尾下標
	 * @param high 第二段陣列的末尾下標
	 */
	public void merge_Sort(int[] tmpNum, int low, int middle, int high) {
		int first = low; // 存放第一段序列下標
		int second = middle + 1; // 存放第二段序列下標
		int tmpkey = 0; // 存放合併陣列的下標
		int tmp[] = new int[high - low + 1]; // 存放合併陣列用的
		while (first <= middle && second <= high) {
			if (tmpNum[first] < tmpNum[second]) {
				tmp[tmpkey] = tmpNum[first];
				first++;
				tmpkey++;
			} else {
				tmp[tmpkey] = tmpNum[second];
				second++;
				tmpkey++;
			}
		}
		// 第一個段陣列沒有遍歷完
		while (first <= middle) {
			tmp[tmpkey] = tmpNum[first];
			first++;
			tmpkey++;
		}
		// 第二個段陣列沒有遍歷完
		while (second <= high) {
			tmp[tmpkey] = tmpNum[high];
			second++;
			tmpkey++;
		}
		int k=low;
		//將合併的陣列拷貝到原始的陣列中
		for (int i = 0; i < tmp.length; i++) {
			tmpNum[k]=tmp[i];
			k++;
		}
	}
	public void sortProgress(){
		//進行每趟歸併,改變字表的長度
		for (int step = 1; step < tmpNum.length; step=2*step) {
			int i=0;
			//進行每趟歸併排序,歸併長度為step的兩個相鄰的子表
			for(i=0;i+2*step-1<tmpNum.length;i=i+2*step){
				merge_Sort(tmpNum, i, i+step-1, i+2*step-1);
			}
			//剩下單獨的一個子表
			if (i+step-1<tmpNum.length) {
				merge_Sort(tmpNum, i, i+step-1, tmpNum.length-1);
			}
		}
	}
	/**
	 * 列印函式
	 */
	public void fnPrint() {
		for (int i = 0; i < tmpNum.length; i++) {
			if (i == tmpNum.length - 1) {
				System.out.println(tmpNum[i]);
			} else {
				System.out.print(tmpNum[i] + "、");
			}
		}
	}
}

八、基數排序:


package algorithm.sort;
/**
 * 基數排序
 * @author baolibin
 */
public class _08_radixSort {
	public static void main(String[] args) {
		int[] tmpNum={54,23,8,187,56,21,341,17,6,23,4,88,33,40,39,73,15};
		radixSort radixsort = new radixSort(tmpNum);
		radixsort.radix_Sort(tmpNum,3); //開始基數排序
		radixsort.fnPrint();
	}
}
/**
 * 
 * @author Administrator
 *
 */
class radixSort{
	private int[] tmpNum; //帶排序的陣列
	private int radix=10; //指0~9,像鄰接連結串列的左側豎著顯示的陣列
	private int[] bucket_offset_right;//一共10位,每個值代表著,在bucket陣列,的對應桶,的末尾的下標。 以及每個桶儲存的個數
	private int[] bucket; ////原本鄰接連結串列的結構用陣列進行儲存,每個桶在對應範圍下標進行儲存。
	public radixSort(int[] tmpNum) {
		this.tmpNum=tmpNum;
		bucket_offset_right=new int[radix]; //代表著每個桶的個數以及在bucket桶陣列中的儲存下標
		bucket=new int[tmpNum.length];
	}
    /**
     *  基數排序部分
     * @param tmpNum 待排序的陣列
     * @param low_index 陣列的開始下標
     * @param high_index 陣列的結尾下標
     * @param max_Num_length 陣列中最大元素的位置
     */
    public void radix_Sort(int[] tmpNum,int max_length){
    	for (int i = 1; i <= max_length; i++) {
			for (int j = 0; j < radix; j++) { //各個桶儲存的個數置為0
				bucket_offset_right[j]=0;
			}
			int countNum=0;
			for (int j = 0; j < tmpNum.length; j++) {  //統計每個桶要裝入的資料的個數
				countNum=tmpNum[j]/((int) Math.pow(10, i-1))%10;
//				System.out.println("countNum="+countNum);
				bucket_offset_right[countNum]++;
			}
			for (int j = 1; j < radix; j++) { //儲存每個桶截止本桶一共裝的個數,存的值對應桶陣列下標,方便進行每個桶快速定位進行儲存
				bucket_offset_right[j]=bucket_offset_right[j]+bucket_offset_right[j-1];
			}
			for (int j = tmpNum.length-1; j >=0; j--) { //將資料依次存入桶中
				countNum=tmpNum[j]/((int) Math.pow(10, i-1))%10;
				bucket[bucket_offset_right[countNum]-1]=tmpNum[j];  //將資料儲存到對應桶的指定陣列位置,倒著進行儲存
				bucket_offset_right[countNum]--; //對應桶儲存位置指標,從桶的末尾往前移一位
			}
			for (int j = 0; j < tmpNum.length; j++) {
				tmpNum[j]=bucket[j];
			}
//			fnPrint();
		}
    }
	/**
	 * 列印函式
	 */
	public void fnPrint() {
		for (int i = 0; i < tmpNum.length; i++) {
			if (i == tmpNum.length - 1) {
				System.out.println(tmpNum[i]);
			} else {
				System.out.print(tmpNum[i] + "、");
			}
		}
	}
}

八大內部排序的複雜度比較: