美文网首页
排序算法

排序算法

作者: Shokka | 来源:发表于2018-09-11 16:49 被阅读0次

二分查找法:O(log2n)

public class demo01 {
    public static int binarySearch(int[] nums,int star,int end,int key){
        if(star > end){
            return -1000;
        }else {
            int mid = ( end + star ) / 2;
            if(nums[mid] == key){
                return mid;
            }else if(nums[mid] > key){
                return binarySearch(nums,star,mid-1,key);
            }else if(nums[mid] < key){
                return binarySearch(nums,mid+1,end,key);
            }else {
                return -1000;
            }
        }

    }
    public static void main(String[] args) {
        int[] a = {1,2,3,4,5,6,7,8,9,10};
        System.out.println(binarySearch(a,0,a.length-1,6));
    }
}

简单排序效率:冒泡 < 选择 < 插入
高级排序:
分析:用交换次数作比较,冒泡排序每一次都交换,而选择排序只记录最值,交换一次。插入排序会让数组不断接近有序,并且对基本有序的数组排序更快。
冒泡排序:时间复杂度 O(n^2)

public class Bubble {
    public static void bubbleSort(int[] nums){
        for(int i = 1 ; i < nums.length ; i++){
            int mark = 0;
            for(int j = 0 ; j < nums.length - i ; j++){
                if (nums[j] > nums[j+1]) {
                    nums[j] ^= nums[j + 1];
                    nums[j + 1] ^= nums[j];
                    nums[j] ^= nums[j + 1];
                    mark = 1;
                }
            }
            if (mark == 0) {
                return;
            }
        }
    }

    public static void main(String[] args) {
        int[] a = {21,4563,113,0,12,4,9,35,667};
        bubbleSort(a);
        for (int i = 0 ; i < a.length ; i++){
            System.out.print(a[i]+" ");
        }
    }
}

选择排序:O(n^2)

public class Select {
    public static void selectSort(int[] a){
        for(int i = 0 ; i < a.length ; i++ ){
            int max = a.length-1-i;
            for (int j = 0 ; j < a.length-1-i ;j++){
                if (a[j] > a[max]){
                    max = j;
                }
            }
            if(max!=a.length-1-i){
                a[max] ^= a[a.length-1-i];
                a[a.length-1-i] ^= a[max];
                a[max] ^= a[a.length-1-i];
            }
        }
    }


    public static void main(String[] args) {
        int a[] = {7, 6, 9, 8, 5,1};
        selectSort(a);
        for (int i = 0 ; i < a.length ; i++){
            System.out.print(a[i]+" ");
        }
    }
}

插入排序:O(n^2)

public class Insert {
    public static void insertSort(int[] nums){
        for (int i = 1 ; i < nums.length ; i++ ){
            int mark = nums[i];
            for (int j = i-1 ; j >= 0 ; j-- ){
                if( mark < nums[j] ){
                    nums[j+1] ^= nums[j];
                    nums[j] ^= nums[j+1];
                    nums[j+1] ^= nums[j];
                }
            }
        }
    }

    public static void main(String[] args) {
        int a[] = {7, 6, 9, 8, 5,1,0};
        insertSort(a);
        for (int i = 0 ; i < a.length ; i++){
            System.out.print(a[i]+" ");
        }
    }
}

快速排序:O(nlogn) ~ O(n^2)

public class Fast {
    public static void fastSort(int[] nums,int begin,int end){
        if ( begin >= end ) {
            return;
        }
        int b = begin;
        int e = end;
        int mark = nums[begin];
        while ( begin < end ){
            while ( begin < end && nums[end] > mark ){
                end--;
            }
            nums[begin] = nums[end];
            while ( begin < end && nums[begin] <= mark ){
                begin++;
            }
            nums[end] = nums[begin];
        }
        nums[begin] = mark;
        fastSort(nums,b,begin-1);
        fastSort(nums,begin+1,e);
    }

    public static void main(String[] args) {
        int a[] = {7, 6, 9, 8, 5,1};
        fastSort(a,0,a.length-1);
        for (int i = 0 ; i < a.length ; i++){
            System.out.print(a[i]+" ");
        }
    }
}

二分法排序:O(nlogn)

public class Merge {
    public static void mergeSort(int[] nums,int begin,int end){
        if( end <= begin ){
            return;
        }else {
            int mid =( begin + end ) /2;
            mergeSort(nums,begin,mid);
            mergeSort(nums,mid+1,end);
            merge(nums,begin,mid+1,end);
        }
    }

    private static void merge(int[] nums, int begin, int mid, int end) {
        int[] temp = new int[end-begin+1];
        int pos = begin,dest = mid,i=0;

        while ( pos <= end && dest <= end ){
            if( nums[pos] <= nums[dest] ){
                temp[i++] = nums[pos++];
            }else {
                temp[i++] = nums[dest++];
            }
        }
        if( pos > end ){
            System.arraycopy(nums,dest,temp,i,temp.length-i);
        }else {
            System.arraycopy(nums,pos,temp,i,temp.length-i);
        }
        System.arraycopy(temp,0,nums,begin,end-begin+1);

    }

    public static void main(String[] args) {
        int a[] = {7, 6, 9, 8, 5,1,1,2,2};
        mergeSort(a,0,a.length-1);
        for (int i = 0 ; i < a.length ; i++){
            System.out.print(a[i]+" ");
        }
    }
}

相关文章

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 算法学习(1)-排序算法

    八大排序算法九大排序算法再总结[经典排序算法][集锦][直观学习排序算法] 视觉直观感受若干常用排序算法 快速排序...

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 前端算法学习-第一篇

    冒泡排序算法 冒泡排序算法是最慢的排序算法之一,也是最容易实现的排序算法。之所以叫冒泡排序是因为使用这种算法排序时...

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 浅谈排序算法

    排序算法有很多种,今天先谈谈一些简单的排序算法。包括桶排序、冒泡排序和快速排序算法。后期总结各种排序算法。 桶排序...

  • 线性排序

    桶排序、计数排序、基数排序 一、线性排序算法介绍 1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法...

  • 算法4:插入排序和选择排序算法的比较

    排序算法列表电梯: 选择排序算法:详见 《算法4》2.1 - 选择排序算法(Selection Sort), Py...

网友评论

      本文标题:排序算法

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