java中經常使用算法(面試)

排序算法有不少種,這裏介紹Java中面試常常出現的三種排序方式:冒泡、選擇、快速. 冒泡:java

顧明思義,是氣泡從液體的底部到頂部的過程,就像串糖葫蘆同樣,先決定最下面的數據。在算法的過程當中是把一組數據從第一位開始兩兩比較(第1位和第2位,第2位和第3位...),選擇大的值或者比較小的值交換到後面的位置。以這種方式比較第一輪後,這組數據中最大的值或者最小的就沉澱到最下面,以此類推倒數第2、三位等。面試

選擇:算法

選擇排序的方式,其實更加貼近咱們正常的思考方式,就是從一組的數據的開始位置,拿出這個數據,而後依次和其餘位置中數據比較,好比找最大值,只要發現後面有比其大的值就進行互換,這樣第一輪下來,第一個位置上的數據就是最大值,而後從第二位依次類推。 快速:參考百度百科:快速排序算法數組

經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。ui

算法思想能夠這個是視頻,頗有意思,否則理解起來有點費力:tieba.baidu.com/p/179715832… Java代碼:spa

ArraySort.javapublic class ArraySort{ //冒泡 public static void bubbleSort(int[] arr) { /*兩個for循環嵌套, *外面的for循環決定一個長度爲m的數據要比較多少輪才能完成排序。 *利用舉例歸類的方式,好比長度爲五、八、9,須要4(第一輪:1和2,2和3,3和4,4和5; *第二輪:1和2,2和3,3和4,5號位置已經上一次中排列好,不須要在參與比較;第三輪:1和2 *,2和3;第四輪:1和2),7,8輪; *裏面的for循環決定每次一輪循環中要作多少次才能結束,這裏面的規律就在長度爲5的舉例中, *能夠歸類,就是四、三、二、1,,也就是它跟輪數有關係,輪數增長,比較次數就減小,比較次數 * n = m - i,i輪數 */ for(int i = 0; i < arr.length - 1; i++) { for(int j = 0; j < arr.length - 1 - i; j++){ //從小到大,大的值放後面位置。 if (arr[j] > arr[j+1]){ swap(arr,j,j+1); } } } }code

//選擇
public static void selectSort(int[] arr) {
	/*
	 * 同理兩個for循環,外面的for是幾輪,由於最後一個不須要比較,因此是長度的m-1輪
	 * 裏面的for是指每一輪比較的過程,一個就是起始位隨着輪數後移,另外比較的次數也隨着減小
	 * 規律同冒泡
	 */
	 for(int i = 0; i < arr.length - 1; i++){ 
		 for(int j = i + 1; j < arr.length; j++){
			 if(arr[i] > arr[j]) {
				 swap(arr,i,j);
			 }
		 }

	 }
}

private static void swap(int[] arr,int index1,int index2){
	int temp = arr[index1];
	arr[index1] = arr[index2];
	arr[index2] = temp;
}

//快速排序

public static void quickSort(int[] arr,int low,int high){		
	int l = low;
	int h = high;
	//基數
	int povit = arr[low];
	//一趟快速排序,即l = h,這時povit的位置就固定了,左邊都是小於它的值,右邊都是大於它的值。
	while(l < h){
		//從右邊開始,經過高位角標h的自減,從最右位向低位逐一取出數組中的值。l < h排除了l=h狀況
		while(povit < arr[h] && l < h){
			h--;
		}
		//若是上面的循環結束,且l != h,說明右邊出現小於povit元素,須要互換位置
		if(l < h){
			swap(arr,l,h);
			l++;//從後一位開始讀取數組
		}
		//從左邊開始,經過低位角標l的自增,從最左邊向高位逐一取出數值中的值。
		while(povit > arr[l] && l < h){
			l++;
		}
		//若是上面的循環結束,且l != h,說明左邊出現大於povit元素,須要互換位置		
		if(l < h){
			swap(arr,l,h);
			h++;
		}
		//向下繼續最外面的while循環,直到l = h
	}
	//遞歸,povit左邊繼續調用quickSort
	if(l > low) quickSort(arr,low,l-1);
	//遞歸,povit右邊繼續調用quickSort
	if(h < high) quickSort(arr,l+1,high);
	
}
複製代碼

SortTest.java public class SortTest { public static void main(String[] agrs){ //定義一個一維組數 int[] arr1 = {5,8,3,9,10,55,32}; ArraySort.bubbleSort(arr1); printArray(arr1); int[] arr2 = {5,8,3,9,10,55,32}; ArraySort.selectSort(arr2); printArray(arr2); int[] arr3 = {5,8,3,9,10,55,32}; ArraySort.quickSort(arr3,0,arr3.length-1); printArray(arr3); }cdn

public static void printArray(int[] arr){
	String str = "[";
	for(int i = 0; i < arr.length; i++) {
		str = str + arr[i] + ",";
	}
	str = str.substring(0,str.length() - 1);
	str = str + "]";
	System.out.print(str);
	System.out.println("");
}
複製代碼

} 有須要Java資料的能夠加我 視頻

相關文章
相關標籤/搜索