排序算法 java
1. 冒泡排序
import java.util.Arrays; public class Bubble { public void bubbleSort(int[] arr) { 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]) { int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } } } public static void main(String[] args) { int[] arr = {5,84,65,32,4,9,11,0,45,84,5,32,48,46}; Bubble bubble = new Bubble(); bubble.bubbleSort(arr); System.out.println(Arrays.toString(arr)); } }
2. 选择排序
import java.util.Arrays; import java.util.Random; public class Selection { public static void selectionSort(int[] arr) { int minIndex, len=arr.length; for (int i=0; i<len-1; i++) { minIndex = i; for (int j =i+1; j<len; j++) { if (arr[j]<arr[minIndex]) { minIndex = j; } } int tmp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = tmp; } } public static void main(String[] args) { int[] a =new int[11]; Random random = new Random(); for (int i=0; i<11; i++) { a[i] = random.nextInt(100); } System.out.println(Arrays.toString(a)); Selection.selectionSort(a); System.out.println(Arrays.toString(a)); } }
3. 插入排序
import java.util.Arrays; import java.util.Random; public class Insertion { public static void insertSort(int[] arr) { for (int i=1; i<arr.length; i++) { int preIndex = i-1; int current = arr[i]; while (preIndex>=0 && current<arr[preIndex]) { arr[preIndex+1] = arr[preIndex]; preIndex--; } arr[preIndex+1] = current; } } public static void main(String[] args) { int[] a =new int[11]; Random random = new Random(); for (int i=0; i<11; i++) { a[i] = random.nextInt(100); } System.out.println(Arrays.toString(a)); Insertion.insertSort(a); System.out.println(Arrays.toString(a)); } }
4. 希尔排序
import java.util.Arrays; import java.util.Random; public class Shell { static void shellSort(int[] arr) { int tmp, len = arr.length, gap=1; while (gap<len/3){ // 动态定义间隔序列 gap = gap*3+1; } for ( ; gap>0; gap=gap/3) { for (int i=gap; i<len; i++) { int preIndex = i-gap; tmp = arr[i]; while (preIndex>=0 && tmp<arr[preIndex]) { arr[preIndex+gap] = arr[preIndex]; preIndex-=gap; } arr[preIndex+gap] = tmp; } } } public static void main(String[] args) { int[] a =new int[11]; Random random = new Random(); for (int i=0; i<11; i++) { a[i] = random.nextInt(100); } System.out.println(Arrays.toString(a)); Shell.shellSort(a); System.out.println(Arrays.toString(a)); } }
5. 快速排序
import java.util.Arrays; import java.util.Random; public class Quick { static void quickSort(int[] arr, int low, int high) { if (low<high) {//如果不加这个判断递归会无法退出导致堆栈溢出异常 int mid = getMiddle(arr, low, high); quickSort(arr, low, mid-1); quickSort(arr, mid+1, high); } } static int getMiddle(int[] arr, int low, int high) { int key = arr[low]; while (low<high) { while (low<high && arr[high]>key) { high--; } arr[low] = arr[high]; while (low<high && arr[low]<key) { low++; } arr[high] = arr[low]; } arr[low] = key; return low; } public static void main(String[] args) { int[] a =new int[11]; Random random = new Random(); for (int i=0; i<11; i++) { a[i] = random.nextInt(100); } System.out.println(Arrays.toString(a)); Quick.quickSort(a, 0, a.length-1); System.out.println(Arrays.toString(a)); } }
6. 堆排序
import java.util.Arrays; import java.util.Random; public class Heap { public static void heapSort(int[] arr) { for (int i = 0; i<arr.length; i++) { creatMaxHeap(arr, arr.length-1-i); swap(arr, 0, arr.length-1-i); } } static void creatMaxHeap(int[] arr, int last) { for (int i=(last-1)/2; i>=0; i--) { int parent = i; while (2*parent+1 <= last) { int bigger = 2*parent+1; if (bigger<last) { if (arr[bigger+1]>arr[bigger]) { bigger++; } } if (arr[bigger] > arr[parent]) { swap(arr, bigger, parent); parent = bigger; } else { break; } } } } static void swap(int[] arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } public static void main(String[] args) { int[] a =new int[11]; Random random = new Random(); for (int i=0; i<11; i++) { a[i] = random.nextInt(100); } System.out.println(Arrays.toString(a)); Heap.heapSort(a); System.out.println(Arrays.toString(a)); } }
7. 归并排序
import java.util.Arrays; import java.util.Random; public class Merge { static void mergeSort(int[] arr, int low, int high) { if (low>=high) return; int mid = (high+low)/2; mergeSort(arr, low, mid); mergeSort(arr, mid+1, high); merge(arr, low, mid, high); } static void merge(int[] arr, int low, int mid, int high) { int[] tmp = new int[high-low+1]; int i = low; int j = mid+1; int k = 0; while (i<=mid && j<=high) { if (arr[i]<arr[j]) { tmp[k++] = arr[i++]; } else { tmp[k++] = arr[j++]; } } while (i<=mid) { tmp[k++] = arr[i++]; } while (j<=high) { tmp[k++] = arr[j++]; } for (int k2=0; k2<tmp.length; k2++) { arr[k2+low] = tmp[k2]; } } public static void main(String[] args) { int[] a =new int[11]; Random random = new Random(); for (int i=0; i<11; i++) { a[i] = random.nextInt(100); } System.out.println(Arrays.toString(a)); Merge.mergeSort(a, 0, a.length-1); System.out.println(Arrays.toString(a)); } }
8. 基数排序
import java.util.Arrays; import java.util.Random; public class Counting { static void countingSort(int[] arr, int maxValue) { int[] bucket = new int[maxValue+1]; int sortedIndex = 0; int arrLen = arr.length; int bucketLen = bucket.length; for (int i =0; i<arrLen; i++) { bucket[arr[i]]++; } for (int j=0; j<bucketLen; j++) { while (bucket[j]>0) { arr[sortedIndex++] = j; bucket[j]--; } } } public static void main(String[] args) { int[] a =new int[11]; Random random = new Random(); for (int i=0; i<11; i++) { a[i] = random.nextInt(100); } System.out.println(Arrays.toString(a)); Counting.countingSort(a, 100); System.out.println(Arrays.toString(a)); } }
9. 桶排序
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Random; public class Bucket { public static void bucketSort(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]); } //桶数 int bucketNum = (max - min) / arr.length + 1; ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum); for(int i = 0; i < bucketNum; i++){ bucketArr.add(new ArrayList<Integer>()); } //将每个元素放入桶 for(int i = 0; i < arr.length; i++){ int num = (arr[i] - min) / (arr.length); bucketArr.get(num).add(arr[i]); } //对每个桶进行排序 for(int i = 0; i < bucketArr.size(); i++){ Collections.sort(bucketArr.get(i)); } System.out.println(bucketArr.toString()); } public static void main(String[] args) { int[] a =new int[11]; Random random = new Random(); for (int i=0; i<11; i++) { a[i] = random.nextInt(100); } System.out.println(Arrays.toString(a)); Bucket.bucketSort(a); System.out.println(Arrays.toString(a)); } }