十大排序算法

1.冒泡排序

冒泡排序的思路就是每次找到数组中最大的值放到数组的末尾,

时间复杂度:O(n2)

public void sort(int[] array){
        for(int end = array.length - 1 ; end > 0 ; end--){
            for(int begin = 1 ; begin <= end ;begin++){
                if(array[begin] < array[begin-1]){
                    int temp = array[begin];
                    array[begin] = array[begin - 1];
                    array[begin - 1] = temp;
                }
            }
        }
    }

冒泡排序的优化1:如果一次循环中没有元素的交换,就说明此时的数组已经是有序的了,就不用在排序了。

public void sort(int[] array){
        for(int end = array.length - 1 ; end > 0 ; end--){
            boolean sorted = true;
            for(int begin = 1 ; begin <= end ;begin++){
                if(array[begin] < array[begin-1]){
                    int temp = array[begin];
                    array[begin] = array[begin - 1];
                    array[begin - 1] = temp;
                    sorted = false;
                }
            }
            if(sorted) return;
        }
    }

冒泡排序的优化2:用一个int来记录最后一次交换的索引,当局部有序的时候,可以减少排序的次数.

public static void sort(int[] array){
        for(int end = array.length - 1 ; end > 0 ; end--){
            int sortedIndex = 1;
            for(int begin = 1 ; begin <= end ;begin++){
                if(array[begin] < array[begin-1]){
                    int temp = array[begin];
                    array[begin] = array[begin - 1];
                    array[begin - 1] = temp;
                    sortedIndex = begin;
                }
            }
            end = sortedIndex;
        }
    }

2.选择排序

时间复杂度:O(n2)

记录数组中最大的值,一次循环之后,在把最大值和数组最后一个元素进行交换.

与冒泡排序的区别:冒泡排序每进行一次比较,就会有一次交换,但是选择排序会在一轮循环之后在交换,交换次数小于冒泡排序.

public static void sort(int[] array){
        for(int end = array.length - 1 ; end > 0 ; end--){
            int max = 0;
            for(int begin = 1 ; begin <= end ;begin++){
                if(array[begin] > array[max]){
                    max = begin;
                }
            }
            int temp = array[max];
            array[max] = array[end];
            array[end] = temp;
        }
    }

3.堆排序

4.插入排序

插入排序的主要思想就是像扑克牌一样,把一张插入已经排好序的数组中,重新变得有序

package suanfa2;

public class InsertSort {

    public static void sort(int[] arr){
        for(int i = 1 ; i < arr.length ; i++){
            int cur = i;
            while(cur > 0 && arr[cur] < arr[cur-1]){
                int temp = arr[cur];
                arr[cur] = arr[cur-1];
                arr[cur-1] = temp;
                cur--;
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = {2,3,5,7,4,6,1};
        InsertSort.sort(arr);
        for(int i = 0 ; i < arr.length ; i++){
            System.out.print(arr[i] + " ");
        }
    }
}

优化:比较之后可以先不交换,先移动,最后空出的那个位置就是你要插入的位置

package suanfa2;

public class InsertSort2 {

    public static void sort(int[] arr){
        for(int i = 1 ; i < arr.length ; i++){
            int cur = i;
            int value = arr[cur];
            while(cur > 0 && value < arr[cur-1]){
                arr[cur] = arr[cur-1];
                cur--;
            }
            arr[cur] = value;
        }
    }

    public static void main(String[] args) {
        int[] arr = {2,3,5,7,4,6,1};
        InsertSort2.sort(arr);
        for(int i = 0 ; i < arr.length ; i++){
            System.out.print(arr[i] + " ");
        }
    }
}

使用二分查找优化

package suanfa2;

public class InsertSort3 {

    public static void sort(int[] arr){
        for(int begin = 1 ; begin < arr.length ; begin++){
            insert(arr,begin,search(arr,begin));
        }
    }
    public static int search(int[] arr,int index){
        int  begin = 0;
        int end = index;
        while(begin < end){
            int middle = (begin + end)/2;
            if(arr[index] < arr[middle]){
                end = middle;
            }else if(arr[index] > arr[middle]){
                begin = middle+1;
            }
        }
        return end;
    }

    public static void insert(int[] arr,int source , int dest ){
        int value = arr[source];
        for(int i = source  ; i > dest ; i--){
            arr[i] =  arr[i - 1];
        }
        arr[dest] = value;
    }


    public static void main(String[] args) {
        int[] arr = {2,3,5,7,4,6,1};
        InsertSort3.sort(arr);
        for(int i = 0 ; i < arr.length ; i++){
            System.out.print(arr[i] + " ");
        }
    }
}
原文地址:https://www.cnblogs.com/lzh66/p/13382614.html