zoukankan      html  css  js  c++  java
  • 排序算法归并排序

    算法思路:

    归并:先"归"后"并"

    1.核心思路:将两个有序的数组和并成一个

    aux[]:存放临时的数据

    merge(a,low,mid,high):将数组a从low到mid这一段,以及从mid+1到high这一段合并

    定义两个指针i和j,i指向low,j指向mid+1,同时往后遍历,将较小的放在aux指定位置,直到i或者j有一个走到了尽头。然后将另一也走向尽头并放入aux后面,此时aux即为最后的排序结果,将其复制回原来的a即可。

    注:由于是递归low>=high要退出循环

    public class MergeSort {
        private int[] aux;
        @Test
        public void test(){
            int[] a = {1,2,5,8,3,4,6,9,7};
            aux = new int[a.length];
            sort(a,0,a.length-1);
            System.out.println(Arrays.toString(a));
        }
    
        public void sort(int[] a, int low, int high){
            int mid = (low+high)/2;
            if(low>=high){
                return;
            }
            sort(a, low, mid);
            sort(a, mid + 1, high);
            merge(a, low, mid, high);
    
        }
    
        /**
         * 将两个有序的数组合并为一个有序的数组,两个数组分别是low-mid ,mid+1-high
         */
        private void merge(int[] a, int low, int mid, int high) {
            // 左右指针i j
            int i=low,j=mid+1;
            // aux指针
            int k;
            for(k=low;i<=mid && j<=high;){
                if(a[i]<a[j]){
                    aux[k++] = a[i++];
                }else{
                    aux[k++] = a[j++];
                }
            }
            while(i<=mid){
                aux[k++] = a[i++];
            }
            while(j<=high){
                aux[k++] = a[j++];
            }
            for(int n=low;n<=high;n++){
                a[n] = aux[n];
            }
        }
    }
  • 相关阅读:
    技能的切实掌握 必须动手
    sqlite 网址
    android视频教程
    Windows Azure
    mysql 存储过程 获取统计结果
    “道家”幸福生活的组成
    [文摘20110724]徐鹤宁 语录
    eclipse swt
    mysq 存储过程 插入测试数据
    WPF 视频教程
  • 原文地址:https://www.cnblogs.com/wsZzz1997/p/14731453.html
Copyright © 2011-2022 走看看