• 常见的排序算法——归并排序(一)


    归并算法:

    先来个图解^v^:

     

    归并排序的思想就是:如果一个数组无序,那么 ,将这个数组一分为二,
    如果一分为二的数组还是无序的,那么就继续往下分数组,直到分出来的数组有序
    (一般情况下,被分的数组只剩两个数,那么这两个数一定有序)。

    这图是我手画的,是归并的数组分解和归并。

    我先哪一个前后已经排好序的数组来举个例子。 

    //归并算法
    /*
    归并算法最主要的就是递归调用,(即:在方法的自身调用自身)
    写一个简单的递归调用的伪代码:
    public static void main(String args[]){
    System.out.printin(f(10));
    }

    static long f(int n){
    if(n<1)return -1;
    if(n==1)return 1;

    return n+f(n-1);//递归调用了自身方法。
    }

    归并排序的思想就是:如果一个数组无序,那么 ,将这个数组一分为二,
    如果一分为二的数组还是无序的,那么就继续往下分数组,直到分出来的数组有序
    (一般情况下,被分的数组只剩两个数,那么这两个数一定有序)

    */
    package sdx;

    public class Main10 {

    public static void main(String[] args) {
    //前提是两个子数组已经排好顺序了
    int a[] = {1,4,7,8,3,6,9};
    sort(a);
    //print(a);
    }

    static void sort(int a[]) {
    //将数组从中间断开
    int mid = a.length/2;
    //分配辅助空间
    int temp[]=new int[a.length];

    //i=0指在前半个数组的第一个位置1
    //j=min+1指在后半截数组的第一个位置上3
    //k=0指在temp的第一个位置上

    int i=0,j=mid+1,k=0;

    while(i<=mid&&j<a.length){
    // if(a[i]<=a[j]){
    // temp[k]=a[i];
    // i++;
    // k++;
    // }else{
    // temp[k]=a[j];
    // j++;
    // k++;
    // }

    if(a[i]<=a[j]){
    temp[k++]=a[i++];
    }else{
    temp[k++]=a[j++];
    }


    }
    while(i<=mid) temp[k++]=a[i++];
    while(j<a.length) temp[k++]=a[j++];

    print(temp);


    }

    static void swap(int a[], int i, int j) {
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
    }

    static void print(int arr[]) {
    for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i] + " ");
    }
    }
    }

    上述代码只是归并的一部分,讲的是将数组合并的归并思想,而分治思想将在下一篇中》》》》》

  • 相关阅读:
    守卫者的挑战(guard)
    pf
    放砖头
    多人背包
    TC-572-D1L2 未完!待续!
    方程的解数
    单词矩阵/贰五语言
    虫食算
    移动玩具
    UVA 125 统计路径条数 FLOYD
  • 原文地址:https://www.cnblogs.com/sdx-BK/p/12064477.html
Copyright © 2020-2023  润新知