Java實現常見的排序算法的示例代碼
一、優化後的冒泡排序
package com.yzh.sort; /* 冒泡排序 */ @SuppressWarnings({"all"}) public class BubbleSort { public static void BubbleSort(int[]a){ for (int i = 0; i <a.length-1 ; i++) { boolean flag=true; 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; flag=false; } } if(flag) break; } } }
二、選擇排序
package com.yzh.sort; @SuppressWarnings({"all"}) public class SelectSort { public static void SelectSort(int[]a) { for (int i = 0; i < a.length - 1; i++) { int index = i;//標記為待比較的數 for (int j = i + 1; j < a.length; j++) { //然後從後面遍歷與第一個數比較 if (a[j] < a[index]) { //如果小,就交換最小值 index = j;//保存最小元素的下標 } } //找到最小值後,將最小的值放到第一的位置,進行下一遍循環 int temp = a[index]; a[index] = a[i]; a[i] = temp; } } }
三、插入排序
package com.yzh.sort; @SuppressWarnings({"all"}) /* 插入排序 */ public class InsertSort { public static void InsertSort(int[]a){ for (int i = 0; i < a.length; i++) { //定義待插入的數 int insertValue=a[i]; //找到待插入數的前一個數的下標 int insertIndex=i-1; while (insertIndex>=0 && insertValue <a[insertIndex]) {//拿a[i]前面的數比較 a[insertIndex+1]=a[insertIndex]; insertIndex--; } a[insertIndex+1]=insertValue; } } }
四、希爾排序
package com.yzh.sort; /* 希爾排序 */ @SuppressWarnings({"all"}) public class ShellSort { public static void ShellSort(int[] a){ for (int gap=a.length / 2; gap > 0; gap = gap / 2) { //將整個數組分為若幹個子數組 for (int i = gap; i < a.length; i++) { //遍歷各組的元素 for (int j = i - gap; j>=0; j=j-gap) { //交換元素 if (a[j]>a[j+gap]) { int temp=a[j]; a[j]=a[j+gap]; a[j+gap]=temp; } } } } } }
五、快速排序
package com.yzh.sort; @SuppressWarnings({"all"}) /* 隨機化快速排序 */ public class QuickSort { public static void QuickSort(int[] arr,int low,int high){ int i,j,temp,t; if(low>=high){ return; } i=low; j=high; //temp就是基準位 temp = arr[low]; while (i<j) { //先看右邊,依次往左遞減 while (temp<=arr[j]&&i<j) { j--; } //再看左邊,依次往右遞增 while (temp>=arr[i]&&i<j) { i++; } //如果滿足條件則交換 if (i<j) { t = arr[j]; arr[j] = arr[i]; arr[i] = t; } } //最後將基準為與i和j相等位置的數字交換 arr[low] = arr[i]; arr[i] = temp; //遞歸調用左半數組 QuickSort(arr, low, j-1); //遞歸調用右半數組 QuickSort(arr, j+1, high); } }
六、隨機化快速排序
package com.yzh.sort; import java.util.Random; import java.util.Scanner; @SuppressWarnings({"all"}) public class RandQuickSort { public static void randsort(int[] arr, int left, int right) { if(left>=right) return; Random random = new Random(); int randIndex = random.nextInt(right-left)+left; //選取隨機主元 //把隨機主元放到數組尾部 int temp = arr[randIndex]; arr[randIndex] = arr[right]; arr[right] = temp; //數組中元素與主元比較 int i = left-1;//註意 for(int j = left;j<=right;j++) { if(arr[j]<arr[right]) { i++; int temp1 = arr[i]; arr[i] = arr[j]; arr[j] = temp1; } } //最後把主元放到適當位置 int temp2 = arr[i+1]; arr[i+1] = arr[right]; arr[right] = temp2; randsort(arr,left,i); randsort(arr,i+2,right); } }
七、歸並排序
package com.yzh.sort; @SuppressWarnings({"all"}) /* 歸並排序 */ public class MergeSort { private static void mergesort(int[] a, int left, int right, int[] temp) { //分解 if (left<right) { int mid=((right-left)>>1)+left; //向左遞歸進行分解 mergesort(a, left, mid, temp); //向右遞歸進行分解 mergesort(a, mid+1, right, temp); //每分解一次便合並一次 merge(a,left,right,mid,temp); } } private static void merge(int[] a, int left, int right, int mid, int[] temp) { int i=left; //初始i,左邊有序序列的初始索引 int j=mid+1;//初始化j,右邊有序序列的初始索引(右邊有序序列的初始位置即中間位置的後一位置) int t=0;//指向temp數組的當前索引,初始為0 //先把左右兩邊的數據(已經有序)按規則填充到temp數組 //直到左右兩邊的有序序列,有一邊處理完成為止 while (i<=mid && j<=right) { //如果左邊有序序列的當前元素小於或等於右邊的有序序列的當前元素,就將左邊的元素填充到temp數組中 if (a[i]<=a[j]) { temp[t++]=a[i++]; }else { //反之,將右邊有序序列的當前元素填充到temp數組中 temp[t++]=a[j++]; } } //把剩餘數據的一邊的元素填充到temp中 while (i<=mid) { //此時說明左邊序列還有剩餘元素 //全部填充到temp數組 temp[t++]=a[i++]; } while (j<=right) { //此時說明左邊序列還有剩餘元素 //全部填充到temp數組 temp[t++]=a[j++]; } //將temp數組的元素復制到原數組 t=0; int tempLeft=left; while (tempLeft<=right) { a[tempLeft++]=temp[t++]; } } }
八、可處理負數的基數排序
package com.yzh.sort; public class RadixSort{ public static void main(String[] args) { int[]a={-2,-1,-6,3,5,1,2,88,-1,99,100,21}; RadixSort(a); for (int x : a) { System.out.print(x+" "); } System.out.println(); } public static int[] RadixSort(int[] arr){ //最大值,用來計算需要找多少次 int max = Integer.MIN_VALUE; //用來判斷是否是負數 int min = Integer.MAX_VALUE; //從該數組中找到最大\最小值 for (int i = 0; i < arr.length; i++) { max = Math.max(max, arr[i]); min = Math.min(min, arr[i]); } //如果最小值小於0,那麼把每個數都減去最小值,這樣可以保證最小的數是0 if (min<0) { for (int i = 0; i < arr.length; i++) { arr[i] -= min; } //max也要處理 max -= min; } //計算最大值有幾位數 int maxLength = (max+"").length(); //定義十個桶,每個桶就是一個一維數組 int[][] bucket = new int[10][arr.length]; //記錄每個桶中實際存放瞭多少個數據 int[] bucketElementCount = new int[10]; //根據最大長度數,決定比較次數 for (int i = 0 ,n = 1 ; i < maxLength ; i++,n*=10) { //每一個數字分別計算餘數 for (int j = 0; j < arr.length ; j++) { int value = arr[j]/n % 10; //把當前遍歷的數放到指定的位置 bucket[value][bucketElementCount[value]] = arr[j]; //該位置加一,為下一個值進來做準備 bucketElementCount[value]++; } //記錄arr的位置 int index = 0; //遍歷取出第n次排序的值,等於0的不需要取 for (int j = 0; j < bucketElementCount.length ; j++) { if (bucketElementCount[j]!=0){ //遍歷取出數據並放到原來的arr中 for (int k = 0; k < bucketElementCount[j]; k++) { arr[index] = bucket[j][k]; index++; } } //把數量置為零,因為還有n輪 bucketElementCount[j] = 0; } } //把排序好的arr重新加上減去的值 if (min<0){ for (int i = 0; i < arr.length ; i++) { arr[i] += min; } } return arr; } }
以上就是Java實現常見的排序算法的示例代碼的詳細內容,更多關於Java排序算法的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- None Found