排序算法 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));
    }
}

 

posted @ 2018-08-23 14:07  Charlie-OwO  阅读(142)  评论(0编辑  收藏  举报