常见排序算法(一)及其Java实现

2019-03-23  本文已影响0人  zengsk

概述

本文主要介绍面试常见的几种排序算法的基本思想、复杂度及其Java实现。包括冒泡、简单选择、直接插入和快速排序


1. 冒泡排序(Bubble Sort)

基本思想
算法复杂度
算法实现(Java)
 /**
     * 冒泡排序
     * @param arr
     */
    public static 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 temp = arr[j]; //元素交换
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }

2. 简单选择排序(Simple Selection Sort)

基本思想

+每一趟从待排序的数据元素中选出最小(最大)的元素,顺序放在待排序的数列最前,直到全部待排序的数据元素全部排完。属于不稳定排序

算法复杂度

最佳情况:T(n) = O(n2) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2)

算法实现(Java)

/**
     * 选择排序
     * @param arr
     */
    public static void selectSort(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            for (int j = i+1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }

3. 直接插入排序(Straight Insertion Sort)

基本思想

算法复杂度

算法实现(Java)

/**
     * 直接插入排序
     * @param arr
     */
    public static void insertSort(int[] arr){
        for (int i = 1; i < arr.length; i++) {
            int tmp = arr[i]; //设置哨兵,用于存储无序列表中取出的待插元素
            int j = i - 1;
            while (j >= 0 && arr[j] > tmp){
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = tmp;
        }
    }

4. 快速排序( Quick Sort )

基本思想

排序全过程描述

算法复杂度

T(n) = O(nlogn) ——当n较大时使用快排比较好,当序列基本有序时用快排反而不好。

算法实现(Java)

/**
     * 快速排序---最好的情况是O(n),最差的情况是O(n2),平均:O(nlogn)
     *      有两种实现方式!!!!
     * @param arr
     * @param low
     * @param high
     */
    public static void quickSort(int[] arr, int low, int high){
        if (low > high) //low 和high分别为序列的第一个和最后一个元素的索引
            return;
        int start = low;
        int end = high;
        int key = arr[low]; //设定一个基准元素
        while (start < end){
            while (start < end && arr[end] >= key){
                end--;
            }
            while (start < end && arr[start] <= key){
                start++;
            }
            if (start < end){
                swap(arr, start, end);  //交换元素
            }
        }
        swap(arr, low, start);  //将基准元素插入到start==end的索引位置,至此第一趟排序过程结束
        quickSort(arr, low, end-1);
        quickSort(arr,end+1, high);
    }

总结

种一棵树最好的时间是十年前,写一段代码最好的时间是现在!写的不好,欢迎批评指正! 后边会陆续更新其它排序算法,如 堆排序、希尔排序、归并排序等!!

上一篇 下一篇

猜你喜欢

热点阅读