排序算法

二分查找法: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]+" ");
        }
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 该系列文章主要是记录下自己暑假这段时间的学习笔记,暑期也在实习,抽空学了很多,每个方面的知识我都会另起一篇博客去记...
    Yanci516阅读 12,277评论 6 19
  • 排序算法基础 排序算法,是一种能将一串数据按照特定的排序方式进行排列的一种算法,一个排序算法的好坏,主要从时间复杂...
    jackyshan阅读 4,011评论 3 11
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,744评论 0 15
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,220评论 0 52
  • 整理学姐学长们的毕业论文时候,猛然间看到整形外科学,突觉已经渐行渐远了,时间已然过去了好多年。 想到那时的自己...
    我就是阿璐阅读 372评论 0 0