常规的排序算法

导读:本篇文章讲解 常规的排序算法,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

在此列举常用简单的排序算法,冒泡、插入、归并和快排,后边有机会再添加其他排序方法。

冒泡排序

思想:每次交换相邻元素,时间复杂度为O(N^2)

private static void bubbleSort(int[] n) {
        //相邻元素交换位置,时间复杂度为O(N^2)
        for(int i = 0; i < n.length; i++) {
            for(int j = 0; j < n.length-1; j++) {
                if(n[j] > n[j+1]) {
                    int tmp = n[j];
                    n[j] = n[j+1];
                    n[j+1] = tmp;
                }
            }
        }
    }

插入排序

思想:每次从后边获取一个元素,与前边已排好序的元素比较,时间复杂度O(N^2)

private static void insertSort(int[] n) {
        //插入排序:每次从后边获取一个元素,与前边已排好序的元素比较,时间复杂度O(N^2)
        for(int i = 1; i < n.length; i++) {
            //与前边已排序的元素比较
            for(int j = i; j > 0; j--) {
                if(n[j-1] > n[j]) {
                    int tmp = n[j-1];
                    n[j-1] = n[j];
                    n[j] = tmp;
                }else {
                    break;
                }
            }
        }
    }

归并排序

/**
     * 归并排序:分治思想,将数组分成两部分,两部分排好序后,进行合并
     * 从下往上,即从短有序数组到长有序数组
     * @param n
     */
    private static void mergeSort(int[] n) {
        merge(n, 0, n.length-1);
    }
    
    private static void merge(int[] n, int start, int end) {
        if(start == end) return;
        
        //
        int mid = (start + end)/2;
        merge(n, start, mid);
        merge(n, mid+1, end);
        
        //治,合并
        int[] tmp = new int[end-start+1];
        int i = 0;
        int p = start;
        int q = mid+1;
        while(p <= mid && q <= end) {
            if(n[p] > n[q]) {
                tmp[i++] = n[q++];
            } else {
                tmp[i++] = n[p++];
            }
        }
        if(p == mid+1) {
            while(q <= end) tmp[i++] = n[q++];
        }
        if(q == end+1) {
            while(p <= mid) tmp[i++] = n[p++];
        }
        for(int t : tmp) {
            n[start++] = t;
        }
    }

快速排序

private static void quickSort1(int[] n) {
        quick1(n, 0, n.length-1);
    }
    
    //挖坑思想,先挖low的元素,从右往左遍历到小于基准的,移到low坑;被移的高位变成坑,用于从左往右大于基准的填。
    //知道前后指针相遇
    private static void quick1(int[] n, int start, int end) {
        if(start >= end) return;
        
        int tmp = n[start];//参照
        int p = start;
        int q = end;
        while(p < q) {
            //从右往左遍历小于基准的
            while(p < q && n[q] > tmp) q--;
            if(p < q) {
                n[p] = n[q];
                p++;
            }
            //从左往右遍历大于基准的
            while(p < q && n[p] < tmp) p++;
            if(p < q) {
                n[q] = n[p];
                q--;
            }
        }
        //结束循环时,p=q
        n[p] = tmp;
        
        quick1(n, start, p-1);
        quick1(n, p+1, end);
    }

其他排序方式,以后添加。。。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16210.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!