• 几种常用排序算法之二(归并排序、快速排序)


    归并排序

    用到分治策略,先把左边和右边排序,再合并左边和右边的元素。然后递归左右子数列。

     1 class test
     2 {
     3     static int[] cell=new int[14];
     4     
     5     public static void main(String[] args) 
     6     {
     7         int i;
     8         int[] arr={1,4,8,5,2,3,7,2,10,14,11,2,16,15};
     9 
    10         mergesort(arr,0,13);
    11 
    12         for(i=0;i<14;i++)
    13           System.out.printf("%3d",arr[i]);
    14         System.out.printf("
    ");
    15     }
    16 
    17     static void mergesort(int arr[],int left,int rigth)
    18     {
    19        int middle;
    20 
    21        if(left<rigth)
    22        {
    23           middle=(left+rigth)/2;
    24           mergesort(arr,left,middle);
    25           mergesort(arr,middle+1,rigth);
    26           merge(arr,left,middle,rigth);
    27        }
    28     }
    29 
    30     static void merge(int[] arr,int left,int middle,int rigth)
    31     {
    32        int li,ri;
    33        int h;
    34 
    35        li=left;    
    36        ri=middle+1;
    37        h=left;       
    38 
    39        while(li<=middle && ri<=rigth)  //两个数组都剩余元素,需要比较大小
    40        {
    41            if(arr[li]>arr[ri])
    42              cell[h++]=arr[ri++];
    43            else
    44              cell[h++]=arr[li++];
    45        }
    46 
    47        while(li<=middle)            //没有遍历完的数组,则直接拷贝剩下元素,因为两个数组都是有序的
    48            cell[h++]=arr[li++];
    49        while(ri<=rigth)
    50            cell[h++]=arr[ri++];
    51 
    52        for(h=left;h<=rigth;h++)//把合并好的元素拷贝回原来的数组
    53            arr[h]=cell[h];       
    54     }
    55 }

    快速排序

    确定基准数,然后把小于基准数的放在左边,大于基准数的放在右边。递归直至完成。

     1 class quick 
     2 {
     3     static void swap(int arr[],int a,int b)
     4     {
     5        int cell;
     6 
     7        cell=arr[a];
     8        arr[a]=arr[b];
     9        arr[b]=cell;
    10     }
    11     
    12     static int median(int arr[],int left,int rigth)//先对左中右三个数进行排序
    13     {
    14        int middle;
    15 
    16        middle=(left+rigth)/2;
    17        if(arr[left]>arr[middle])
    18            swap(arr,left,middle);
    19        if(arr[left]>arr[rigth])
    20            swap(arr,left,rigth);
    21        if(arr[middle]>arr[rigth])
    22            swap(arr,middle,rigth);
    23 
    24        swap(arr,middle,rigth-1);  //隐藏基准数
    25        return arr[rigth-1];       //返回基准数
    26      }
    27 
    28     static void quicksort(int arr[],int left,int rigth)
    29     {
    30        int i,j;
    31        int pivot;
    32 
    33        if(left<rigth) 
    34        {  pivot=median(arr,left,rigth);    
    35           i=left;
    36           j=rigth-1;
    37           while(i<j)
    38           {               
    39              while(arr[++i]<pivot){}  //在左边找比基准数大的数
    40              while(arr[--j]>pivot){}  //在右边找比基准数大的数
    41              if(i<j)
    42                swap(arr,i,j);         //交换
    43              else
    44                break;
    45           }
    46           swap(arr,i,rigth-1);        //把基准数放回正确的位置,基准数位置确定下来了
    47           quicksort(arr,left,i-1);
    48           quicksort(arr,i+1,rigth);
    49        }
    50        else
    51           return;
    52     }
    53 
    54     public static void main(String[] args) 
    55     {
    56         int[] arr={1,2,1,5,4,7,8,3,6,5,7,-5};
    57         int i;
    58          
    59         quicksort(arr,0,11);
    60         for(i=0;i<12;i++)
    61           System.out.printf("%3d",arr[i]);
    62         System.out.printf("
    ");
    63     }
    64 }
  • 相关阅读:
    windows常用命令
    Qt 添加 QtNetwork 库文件
    LoadLibrary加载动态库失败
    C++11 Function 使用场景
    编程书籍集
    代码重构例集
    多重循环编码规范
    vim 命令学习(基础篇)
    QT构建窗体(父窗体传为野指针)异常案例
    JAVA_SE基础——26.[深入解析]局部变量与成员变量的差别
  • 原文地址:https://www.cnblogs.com/ttpn2981916/p/6403747.html
Copyright © 2020-2023  润新知