排序算法总结

来源:互联网 发布:企业注册的淘宝号 编辑:程序博客网 时间:2024/06/04 20:14

快排:

时间复杂度最差:O(n^2),平均O(nlgn)

public void myQuickSort(int[] a, int start, int end){        //a:待排序数组        //start:待排序起点下标        //end:待排序终点下标        if (start >= end) return;        int tar = a[start];        int s = start;        int b = end;        while (s < b) {            while (s < b && a[s] <= tar) s++;            while (s < b && a[b] > tar) b--;            int temp = a[s];            a[s] = a[b];            a[b] = temp;        }        if (s > tar)            s-=1;        a[start] = a[s];        a[s] = tar;        myQuickSort(a, start, s-1);        myQuickSort(a, s+1, end);    }

归并排序:

时间复杂度O(nlgn)

public void merge(int[] a, int p, int q, int r) {        //将带排序数组a下标从p到q和q+1到r合并。        int n1 = q-p+1;        int n2 = r-q;        int[] arr1 = new int[n1];        int[] arr2 = new int[n2];        for (int i = 0; i < n1; i++) arr1[i] = a[p+i];        for (int i = 0; i < n2; i++) arr2[i] = a[q+1+i];        int arr1_id = 0;        int arr2_id = 0;        while (p < r) {            if (arr1[arr1_id] < arr2[arr2_id]) {                a[p++] = arr1[arr1_id++];            }else {                a[p++] = arr2[arr2_id++];            }            if (arr1_id == n1) {                while(arr2_id < n2)                    a[p++] = arr2[arr2_id++];            }            if (arr2_id == n2) {                while(arr1_id < n1)                    a[p++] = arr1[arr1_id++];            }        }    }    public void mergeSort(int[] a, int p, int r) {        //将带排序数组:a。        //起点下标:p        //终点下标:r        if (p == r) return;        int q = (p + r) / 2;        mergeSort(a, p, q);        mergeSort(a, q+1, r);        merge(a, p, q, r);    }

冒泡排序

时间复杂度O(n^2)

public void bubbleSort(int[] a) {        int n = a.length;        for (int i = 0; i < n; i++) {            boolean change = false;            for (int j = 0; j < n-i-1; j++) {                if (a[j] > a[j+1]) {                    int temp = a[j+1];                    a[j+1] = a[j];                    a[j] = temp;                    change = true;                }            }            if (!change) return;        }    }

插入排序:

时间复杂度最差:O(n^2),最好O(n)

public void insertionSort(int[] a) {        //a:待排序数组        for (int i = 0; i < a.length; i++) {            int id = i;            int temp = a[i];            for (int j = i-1; j >= 0; j--) {                if (temp < a[j]) id = j;                else break;            }            int t = i;            while (t > id) {                a[t] = a[t-1];                t--;            }            a[id] = temp;        }    }

选择排序

时间复杂度最差:O(n^2)

public void selectSort(int[] a) {        for(int i = 0; i < a.length; i++) {            int min = i;            for (int j = i+1; j < a.length; j++) {                if (a[j] < a[min]) min = j;            }            if (min != i) {                int temp = a[i];                a[i] = a[min];                a[min] = temp;            }        }    }
原创粉丝点击