• 堆排序,快速排序


    大根堆排序算法的基本操作: 

    ① 初始化操作:将R[1..n]构造为初始堆;

    ② 每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。

    注意: 

    ①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。

    ②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反:在任何时刻堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止。

    注意:1,每次新建的大根堆放到有序序列里。2,新建大根堆注意根和孩子比较过后还需要比较孩子和孙子。

     1 import java.util.*;
     2 public class HeapSort {
     3     public void exchageElement(int[] a, int index1, int index2){
     4         int temp = a[index1];
     5         a[index1] = a[index2];
     6         a[index2] = temp;
     7     }    
     8     public void  heapSort(int[] a,int lastIndex){
     9         if(a.length == 0) return ;
    10         for(int i=(lastIndex-1)/2;i>=0;i--){
    11             int k = i; //最后一个非叶子节点
    12             while(2*k+1<=lastIndex){
    13                 int maxIndex = 2*k+1;//把左孩子暂时当成最大
    14                 if(maxIndex<lastIndex){
    15                     //证明有右节点
    16                     if(a[maxIndex]<a[maxIndex+1])maxIndex++; //如果右节点比左节点要大则最大孩子为右节点(用maxIndex++来提高时间复杂度)
    17                 }
    18                 if(a[maxIndex]>a[k]){
    19                      new HeapSort().exchageElement(a,maxIndex,k);
    20                      k=maxIndex;
    21                 }else{
    22                     break;
    23                     
    24                 }
    25             }
    26         }
    27     
    28     }
    29     public static void main (String[] args) {
    30         Scanner sc = new Scanner(System.in);
    31         int n = sc.nextInt();
    32         int[] arrInt = new int[n];
    33         for(int i = 0;i<n;i++){
    34             arrInt[i] = sc.nextInt();
    35         }
    36          HeapSort hs=new HeapSort();
    37         for(int i=arrInt.length-1;i>0;i--){
    38             hs.heapSort(arrInt,i);
    39             hs.exchageElement(arrInt,0,i);
    40         }
    41         
    42         System.out.println (Arrays.toString(arrInt));
    43     }
    44 }

    快速排序算法的基本操作:

      分析:快速排序是冒泡排序的一种升级,打怪打不过咱们升级吧···宗旨是一趟排序下来可以交换多个元素,时间复杂度为O(logn).

    1. 把数组的首个元素a[0]存到temp中作为第一次排序的比较对象,j表示从右到左进行比较的下标,发现比temp大则与第i个元素交换(恰好第i个元素放到temp作为基准比较元素);i表示从左到右比较的下标,发现比temp小则与第j个元素交换(此时j个元素已经复制到前面了)。如此下去直到i==j为止,一趟排序结束。
    2. 这样一趟排序结束后分成两个数组分别进行排序,重复第一步。
    3. 注意:快排两端节点分析
    4. 
      
       1 import java.util.*;
       2 public class kuaipai {
       3     public static void main (String[] args) {
       4         Scanner sc = new Scanner(System.in);
       5         while(sc.hasNext()){
       6             int n = sc.nextInt();
       7             int[] arrInt = new int[n];
       8             for(int i = 0;i<n;i++){
       9                 arrInt[i] = sc.nextInt();
      10             }
      11             int i=0;int j=n-1;
      12             kuaipai kp = new kuaipai();
      13             kp.kuaiP(arrInt,i,j);
      14             
      15             System.out.print(Arrays.toString(arrInt));
      16         }
      17     }
      18     public void kuaiP(int[] a, int i, int j){
      19         int low = i;
      20         int hight = j;
      21         if(low>=hight) return ;
      22         int temp = a[low];
      23         while(low<hight){
      24             while(a[hight]>=temp&&low<hight) hight--;
      25             a[low] = a[hight];
      26             while(a[low]<=temp&&low<hight) low++;
      27             a[hight] = a[low];
      28         }
      29         a[low] = temp;
      30         kuaiP(a,0,low-1);
      31         kuaiP(a,low+1,j);
      32     }
      33 }
      
      
      
       
  • 相关阅读:
    js秒换成天时分
    vuex
    匹配iPhoneX
    ASP 解析json
    WPF 实现多语言支持
    c# 用DotNetZip来解压/压缩文件
    WPF UI Close button
    VB 获取所有窗体菜单信息
    ASP/ASP.NET/VB6文件上传
    c# 上传图片到一个外链相册服务器
  • 原文地址:https://www.cnblogs.com/ScarecrowAnBird/p/6755758.html
Copyright © 2020-2023  润新知