• 快速排序QuickSort


    前几天实现了直接插入排序、冒泡排序和直接选择排序这三个基础排序。今天看了一下冒泡排序的改进算法,快速排序。单独记录一下,后面还有归并和基数排序等

    快速排序

    1.选择一个支点默认为数组第一个元素及array[start]作为支点,将所有大于支点元素的值放到支点后面,将所有小于支点元素的值放到支点前面,完成一次划分,返回支点的位置index

    2.通过一个划分形成两个带排序的序列,[start, index - 1]和[index + 1, end]两个,在执行1直到序列元素只有1个则已经完成排序

    具体解释和注意代码注释中有说明

    QuickSort.java

     1 package com.gxf.sort;
     2 
     3 /**
     4  * 这里实现快速排序
     5  * 快速排序是对冒泡排序的一种改进
     6  * 选数组中的一个元素作为支点,通常选第一个元素
     7  * 将大于支点的元素放到支点后面,将小于支点的元素放到支点前面
     8  * 这样一趟下来,支点前面的就是小于支点元素,支点后面的大于支点元素
     9  * 每一趟划分,返回支点的位置,这样形成了两个带排序的数组,在分别对两个数组进行递归调用
    10  * 直到每次划分只有一个元素
    11  * @author Administrator
    12  *
    13  */
    14 public class QuickSort {
    15     /**
    16      * 这里是对数组的一趟划分,返回支点在数组中的位置,默认第一个元素为支点
    17      * @param Rec
    18      * @param start
    19      * @param end
    20      * @return
    21      */
    22     public int quickSort(Rec rec[], int start,int end){
    23         int fulcrum = rec[start].key;//fulcrum有道查的支点
    24         int i = start;
    25         int j = end;//分别指向开头和结束
    26         while(i < j){//i==j时结束一次划分
    27             while(i < j && rec[j].key > fulcrum)//找出右边比支点小的元素
    28                 j--;
    29             rec[i].key = rec[j].key;//右边元素之间移到支点位置即可
    30             while(i < j && rec[i].key < fulcrum)//找出左边比支点大的元素
    31                 i++;
    32             rec[j].key = rec[i].key;//左边的大于支点元素之间交换过去
    33         }
    34         //这里要不要考虑相等元素的问题
    35         rec[i].key = fulcrum;
    36         return i;
    37     }
    38     
    39     /**
    40      * 对数组进行快速排序
    41      * 递归实现
    42      * @param rec
    43      */
    44     public void sort(Rec rec[], int start, int end){
    45         int index;
    46         if(start < end){
    47             index = quickSort(rec, start, end);
    48             sort(rec, start, index - 1);
    49             sort(rec, index + 1, end);//注意这里要+1要不然会无限递归,造成栈溢出
    50         }
    51     }
    52     /**
    53      * @param rec
    54      */
    55     public void sort(Rec rec[]){
    56         sort(rec, 0, rec.length - 1);
    57     }
    58     
    59 }

    Rec.java

     1 package com.gxf.sort;
     2 
     3 public class Rec {
     4     public int key;
     5     
     6     public Rec(int key){
     7         this.key = key;
     8     }
     9     public Rec(){
    10         
    11     }
    12     public void showArray(Rec rec[]){
    13         for(int i = 0; i < rec.length ; i++){
    14             
    15             System.out.print(rec[i].key + " ");
    16         }
    17     }
    18     public Rec[] getRecArray(int array[]){
    19         Rec result[] = new Rec[array.length];
    20         for(int i = 0; i < array.length; i++){
    21             result[i] =  new Rec(array[i]);
    22         }
    23         return result;
    24     }
    25 }

    Test.java

     1 package com.gxf.sort;
     2 
     3 public class Test {
     4 
     5     public static void main(String[] args) {
     6         Rec rec = new Rec();
     7         QuickSort quickSort = new QuickSort();
     8         
     9         int array[] = new int[]{0, 32, 1, 34, 54, 5, 6};
    10         Rec array_rec[] = rec.getRecArray(array);
    11         System.out.println("使用快速排序之前的顺序:");
    12         rec.showArray(array_rec);
    13         
    14         quickSort.sort(array_rec);
    15         
    16         System.out.println("使用快速排序之后的顺序:");
    17         rec.showArray(array_rec);
    18     }
    19 
    20 }

    ps:这里主要参考了西电版的数据结构

  • 相关阅读:
    每日一题 为了工作 2020 0330 第二十八题
    每日一题 为了工作 2020 0329 第二十七题
    每日一题 为了工作 2020 0328 第二十六题
    每日一题 为了工作 2020 0325 第二十五题
    每日一题 为了工作 2020 0326 第二十四题
    学习总结(十四)
    学习总结(十三)
    学习总结(十二)
    学习总结(十一)
    学习总结(十)
  • 原文地址:https://www.cnblogs.com/luckygxf/p/4077353.html
Copyright © 2020-2023  润新知