1. 程式人生 > >java中幾種常見的排序演算法實現

java中幾種常見的排序演算法實現

在Java中得資料結構比較

| 資料機構 | 優點| 缺點 | |陣列 | 插入快,在直到下標得情況下可快速地存取| 查詢慢,刪除慢,大小固定 | |有序陣列 | 比無序得陣列查詢快|刪除和插入慢,大小固定 | |棧 | 提供後進先出方式的存取| 存取其他項很慢 | |佇列 |提供先進先出方式的存取|存取其他項很慢 | |連結串列 | 插入快、刪除快| 查詢慢 | | 二叉樹 |查詢、插入、刪除都快(樹保持平衡)| 刪除演算法複雜 | |紅-黑樹 | 查詢、插入、刪除都快。樹總是平衡的| 演算法複雜 | | 2-3-4樹 | 查詢、插入、刪除都快,樹總是平衡的|演算法複雜 | |雜湊表| 如果關鍵字一隻則存取極快,插入快| 刪除慢,如果不知道關鍵字則存取慢 | |堆 | 插入、刪除快、對最大資料項的存取很快|對其他資料項存取慢 | | 圖 | 對現實世界建模|演算法慢且複雜 |

資料結構是每一門語言中都很重要。在這裡有幾種自己理解的。 簡單排序: package easysort;

public class EasySort {

public static void main(String[] args) {
	/*	// 隨機生成一個數組
	Random ran=new Random();
	int[] a=new int[5];
	for(int i=0;i<5;i++) {
		a[i]=ran.nextInt(20);
	}
	easySort(a);
	System.out.println();
	System.out.println("排序後的陣列為");
	for(int i:a) {
		System.out.println(i+" ");
	}*/
	//這個是輸出一個固定的陣列,對其進行排序
	int[] a= {2,4,8,1,3};
	easySort(a);
	for(int i:a) {
		System.out.println(i+" ");
	}
}
// 簡單排序
		/*
		 * 思路:按照約定的排序順序,兩兩比較所有的資料
		 * 演算法複雜度:O(n^2)
		 * 比較次數,無論好壞都是n*(n-1)/2次
		 * 交換次數:每比較一次就交換一次。n*(n-1)/2次
		 * */
private static void easySort(int[] a) {

	for(int i=0;i<a.length;i++) {
		for(int j=i+1;j<a.length;j++) {//逐個遍歷i後面的數
			if(a[j]<a[i]) {//從小到大的排序,如果有比i還笑的數,則交換i和j的位置
				int temp=a[j];
				a[j]=a[i];
				a[i]=temp;
			}
		}
	}		
} 

} 氣泡排序: package bubblesort;

//import java.util.Random;

public class BubbleSort {

public static void main(String[] args) {
/*	// 隨機生成一個數組
	Random ran=new Random();
	int[] a=new int[5];
	for(int i=0;i<5;i++) {
		a[i]=ran.nextInt(20);
	}
	System.out.println("排序前的陣列為");
	for(int i : a) {
		System.out.println(i+" ");
	}
	bubbleSort(a);
	System.out.println();
	System.out.println("排序後的陣列為");
	for(int i:a) {
		System.out.println(i+" ");
	}*/
	
	//這個是輸入一個固定的陣列,對其進行排序
	int[] a= {2,4,8,1,3};
	bubbleSort(a);
	for(int i:a) {
		System.out.println(i+" ");
	}	
}
	
/**
 * author:zl
 */
// 氣泡排序的核心
/*
 * 思路:按照約定的排序順序,兩兩比較相鄰的資料,如果反序則交換,直到沒有反序記錄為止
 * 演算法複雜度:O(n^2)
 * 比較次數,無論好壞都是n*(n-1)/2次
 * 交換次數:最好時,無需交換,最壞時,每比較一次就交換一次:n*(n-1)/2次
 * */

private static void bubbleSort(int[] a) {
	
	for(int i=0;i<a.length;i++)
	{
		for(int j=0;j<a.length-i-1;j++) {
			if(a[j]>a[j+1])//兩兩比較相鄰的數
			{
				int temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}
}

} 選擇排序: package selectsort;

//import java.util.Random;

public class SelectSort {

public static void main(String[] args) {
	// 隨機生成陣列
	/*Random ran=new Random();
	int[] a=new int[5];
	for(int i=0;i<5;i++) {
		a[i]=ran.nextInt(20);
	}*/
	int[] a= {2,4,8,1,3};
	selectSort(a);
	for(int i:a) {
		System.out.println(i+" ");
	}
}
// 選擇排序
		/*
		 * 思路:每次從資料中選出一個最大值或者最小值放在序列的起始位置,直到全部
		 * 		待排序的資料元素排序完
		 * 演算法特點:交換移動資料的次數少,節約時間
		 * 演算法複雜度:o(n^2)
		 * 比較次數:n*(n-1)/2次
		 * 交換次數:最好時無需交換,最壞時,交換n-1次
		 * */
private static void selectSort(int[] a) {
	for(int i=0;i<a.length-1;i++) {//預設i為最小的,然後和後面的數依次比較
		for(int j=i+1;j<a.length;j++) {//從i+1開始
			if(a[j]<a[i]) {//依次判斷a[i]與後面資料的大小並交換
				int temp=a[j];
				a[j]=a[i];
				a[i]=temp;
			}
		}
	}
}

} 插入排序: package insertsort;

public class InsertSort {

public static void main(String[] args) {
	// 隨機生成陣列
			/*Random ran=new Random();
			int[] a=new int[5];
			for(int i=0;i<5;i++) {
				a[i]=ran.nextInt(20);
			}*/
			int[] a= {2,4,8,1,3};
			insertSort(a);
			for(int i:a) {
				System.out.println(i+" ");
			}
}
private static void insertSort(int[] a) {
	// 插入排序
	/*
	 * 思路:每次從資料中選出一個數據插入到已經排好序的有序表中,從而得到一個新的
	 * 演算法複雜讀:O(n^2)
	 * 比較次數:最好時,n-次,;最壞時,(n+2)(n+1)/2次
	 * 交換次數:最好時,無需交換;最壞時,(n+2)(n+1)/2次
	 * */
	for(int i=1;i<a.length;i++) {	//第一個資料不用插入,從第二個資料開始
		
			for(int j=i;j>0&&a[j]<a[j-1];j--) {	//插入的位置為j,判斷和前一個數的大小,並交換
				swap(a,j,j-1);//呼叫自定義的函式
		}
	}
}

private static void swap(int[] a, int j, int i) {
	int temp=a[i];
	a[i]=a[j];
	a[j]=temp;
}

}

快速排序: package quicksort;

public class QuickSort {

public static void main(String[] args) {
	// 隨機生成陣列
	/*Random ran=new Random();
	int[] a=new int[5];
	for(int i=0;i<5;i++) {
		a[i]=ran.nextInt(20);
	}*/
	int[] a= {2,4,8,1,3};
	quickSort(a,0,4);
	for(int i:a) {
		System.out.println(i+" ");
	}
}
private static void quickSort(int[] a, int start, int end) {

	// 快速排序
	/*
	 * 思路:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有
	 * 		資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分數
	 * 		據分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料
	 * 		變成有序序列。
	 * */
	 //		設定一箇中間值key
	int modkey=a[start];
	//		設定陣列左邊的索引,往右移動判斷比modkey大的數
	int i=start;
	//		設定陣列右邊的索引,往左移動判斷比modkey小的數
	int j=end;
	//		左邊小於右邊則陣列時無序的
	while(i<j) {
		while(a[j]>modkey&&j>start) {
			j--;
		}
		while(a[i]<modkey&&i<end) {
			i++;
		}
		if(i<j) {
			int temp=a[i];
			a[i]=a[j];
			a[j]=temp;
		}	
	}
	//		左邊大於右邊,第一次排序完,將a[j]與modkey對換
	//		實現了modkey左邊小,右邊大
	if(i>j) {
		int temp=a[j];
		a[j]=a[start];
		a[start]=temp;
	}
	//遞迴呼叫
	if(j>start&&j<end) {
		quickSort(a,start,j-1);
		quickSort(a,j+1,end);	
	}	
}

} 以上的幾種排序演算法只是個人心得。