美文网首页
常见排序算法

常见排序算法

作者: 牛顿爱编程 | 来源:发表于2015-12-08 18:30 被阅读45次

整理常见排序算法。


package simple;

public class Sorts {

    public static void main(String[] args) {
        int[] A = { 12, 2, 3363, 53, 25, 523, 6, 63, 7 };
        Sorts.bucketSort(A, 4);
        for(int i = 0; i < A.length; i++) {
            System.out.println(A[i]);
        }
    }
    
    
    /**
     * 关键点是外循环n-1次,每次内循环操作次数减1,基本操作是交换
     */
    public static void bubbleSort(int[] A) {
        if(null == A || A.length <= 1) {
            return;
        }
        int len = A.length;
        for(int i = 0; i < len - 1; i++) {
            for(int j = 0; j < len - 1 - i; j++) {
                if(A[j] > A[j + 1]) {
                    int tem = A[j];
                    A[j] = A[j + 1];
                    A[j + 1] = tem;
                }
            }
        }
    }
    
    /**
     * 前面已经有序,比后面值大的元素依次往后走一步,插入数据
     */
    public static void insertSort(int[] A) {
        if(null == A || A.length <= 1) {
            return;
        }
        int len = A.length;
        for(int i = 1; i < len; i++) {
            int k = i - 1;
            int m = A[i];
            while(k >= 0 && A[k] > m) {
                A[k + 1] = A[k];
                k--;
            }
            A[k + 1] = m;
        }
    }
    
    /**
     * 每次选择当前数组中最小值和首元素交换
     */
    public static void selectionSort(int[] A) {
        if(null == A || A.length <= 1) {
            return;
        }
        int len = A.length;
        for(int i = 0; i < len - 1; i++) {
            int min = i;
            for(int j = min + 1; j < len; j++) {
                if(A[j] < A[min]) {
                    min = j;
                }
            }
            if(min != i) {
                int tem = A[i];
                A[i] = A[min];
                A[min] = tem;
            }
        }
    }
    
    public static void quickSort(int[] A, int left, int right) {
        if(left >= right || null == A || A.length <= 1) {
            return;
        }
        int first = left, last = right;
        int m = A[first];
        while(first < last) {
            while(first < last && A[last] >= m) {
                last--;
            }
            A[first] = A[last];
            while(first < last && A[first] <= m) {
                first++;
            }
            A[last] = A[first];
        }
        int mid = first;
        A[mid] = m;
        quickSort(A, left, mid -1);
        quickSort(A, mid + 1, right);
    }
    
    /**
     * 相当于合并两个有序数组,需要申请一个新的数组保存有序后的数据,然后给原数组重新赋值
     */
    public static void merge(int[] A, int left, int mid, int right) {
        int len = right - left + 1;
        int r[] = new int[len];
        int firstA = left, lastA = mid, firstB = mid + 1,lastB = right;
        int i = 0;
        while(firstA <= lastA && firstB <= lastB) {
            if(A[firstA] <= A[firstB]) {
                r[i++] = A[firstA++];
            } else {
                r[i++] = A[firstB++];
            }
        }
        while(firstA <= lastA) {
            r[i++] = A[firstA++];
        }
        while(firstB <= lastB) {
            r[i++] = A[firstB++];
        }
        for(int j = 0; j < len; j++) {
            A[left + j] = r[j];
        }
    }
    
    public static void mergeSort(int[] A, int left, int right) {
        if(null == A || A.length <= 1 || left >= right) {
            return;
        }
        int mid = (left + right) / 2;
        mergeSort(A, left, mid);
        mergeSort(A, mid + 1, right);
        merge(A, left, mid, right);
    }
    
    /*堆排序*/
    public static void headSort(int[] A) {
        if(null == A || A.length <= 1) {
            return;
        }
        int len = A.length;
        for(int i = (len / 2) - 1; i >= 0; i--) {
            adjust(A, i, len);
        }
        for(int i = len - 1; i >= 0; i--) {
            int tem = A[0];
            A[0] = A[i];
            A[i] = tem;
            adjust(A, 0, i);
        }
    }
    
    public static void adjust(int[] A, int pos, int len) {
        if(null == A || A.length <= 1 || pos >= A.length || pos >= len) {
            return;
        }
        int m = pos;
        while(2 * m + 1 < len) {
            int leftP = 2 * m + 1;
            if(leftP + 1 < len && A[leftP + 1] > A[leftP]) {
                leftP++;
            }
            if(A[m] < A[leftP]) {
                int tem  = A[m];
                A[m] = A[leftP];
                A[leftP] = tem;
            } else {
                break;
            }
            m = leftP;
        }
    }
    
    /*桶排序*/
    public static void bucketSort(int[] A, int m) {
        int len = A.length;
        int[][] bucket = new int[10][len];
        int[] num = new int[10];
        int base = 1;
        for(int q = 0; q < m; q++){
            for(int i = 0; i < len; i++) {
                int k = (A[i] / base) % 10;
                bucket[k][num[k]] = A[i];
                num[k]++;
            }
            int ss = 0;
            for(int i = 0; i < 10; i++) {
                if(num[i] != 0) {
                    for(int j = 0; j < num[i]; j++) {
                        A[ss++] = bucket[i][j];
                    }
                }
                num[i] = 0;
            }
            base *= 10;
        }
    }

}

相关文章

  • 数据结构与算法

    常见排序算法 堆排序 算法大全 算法大汇总

  • LeetCode大全

    1.常见排序算法: 常见的排序算法:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、...

  • 排序算法

    常见的排序算法 常见的排序算法有:插入、希尔、选择、冒泡、归并、快速、堆排序。。。 插入排序 算法步骤一、从数组的...

  • Python知识点:常见算法的python实现

    提到排序算法,常见的有如下几种:冒泡排序、选择排序、插入排序、快速排序、堆排序、归并排序、希尔排序;查找算法最常见...

  • 排序算法(四) 希尔排序(插入排序的进化)

    参考Java排序算法(四):希尔排序常见排序算法 - 希尔排序 (Shell Sort) 希尔排序算法是按其设计者...

  • Rust数据结构——排序算法(一)

    Rust数据结构——排序算法(一) 0x01 常见的排序算法 排序算法是数据结构中很常见的算法。如果你了解过数据结...

  • IOS常见算法

    常见算法: 快速排序: 选择排序: 冒泡排序: 测试代码:

  • 常见排序算法

    整理常见排序算法。

  • 开发者应该掌握的几种排序算法

    该篇文章主要介绍了算法基础以及几种常见的排序算法:选择排序、插入排序、冒泡排序、快速排序、堆排序。 一、算法基础 ...

  • 排序算法

    排序算法 排序是最基本的算法之一,常见的排序算法有插入排序、希尔排序、选择排序、冒泡排序、堆排序、归并排序及快速排...

网友评论

      本文标题:常见排序算法

      本文链接:https://www.haomeiwen.com/subject/guklhttx.html