• 【Java】五种常见排序之------------------快速排序


                • 原理:1.取序列第一个记录为枢纽记录,其关键字为Pivotkey;指针low指向序列第一个位置,指针high
                   * 指向序列最后一个位置;
                   * 2.从high指向的记录开始,向前找到一个关键字的值小于Pivotkey的记录,将其放到low指向的
                   * 位置,low++;
                   * 3.从low指向的记录开始,向后找到第一个关键字的值大于Pivotkey的记录,
                   * 将其放到high指向的位置,high--;
                   * 4.重复2、3,直到low==high,将枢纽记录放在low(high)指向的位置;
                • 时间复杂度为:O(nlogn)
                • 空间复杂度:O(logn)
                • 代码及原理视图:
    代码
    package paixu;
    /**
     * @author xpengfei
     */
    import java.util.Scanner;


    /*
     * 快速排序
     * 时间复杂度为O(nlogn)
     * 1.取序列第一个记录为枢纽记录,其关键字为Pivotkey;指针low指向序列第一个位置,指针high
     * 指向序列最后一个位置;
     * 2.从high指向的记录开始,向前找到一个关键字的值小于Pivotkey的记录,将其放到low指向的
     * 位置,low++;
     * 3.从low指向的记录开始,向后找到第一个关键字的值大于Pivotkey的记录,
     * 将其放到high指向的位置,high--;
     * 4.重复2、3,直到low==high,将枢纽记录放在low(high)指向的位置;
     */
    public class sortFive {
    private static int[]num;
    private static int n;
    private static int Pivotkey;
    private static int low;
    private static int high;
    static Scanner input=new Scanner(System.in);
    //构造函数,随机生成要排序的数组
    public sortFive(){}
    public sortFive(int size){
    n=size;
    num=new int[n];
    System.out.println("随机生成的数组为:");
    for(int i=0;i<n;i++){
    num[i]=(int)(Math.random()*1000);
    System.out.print(num[i]+" ");
    }
    System.out.println();
    }
    //数组初始化,手动输入进行数据测试
    public void init(){
    System.out.println("请输入待排序的数的个数:");
    n=input.nextInt();
    num=new int[n];
    for(int i=0;i<n;i++){
    num[i]=input.nextInt();
    }
    System.out.println("输入的待排序数为:");
    for(int i=0;i<n;i++){
    System.out.print(num[i]+" ");
    }
    System.out.println();
    }
    //数组排序
    public void sort(int low,int high){
    int lowborder,highborder;
    lowborder=low;
    highborder=high;
    Pivotkey=num[low];
    while(low<high){
    while(low<high && Pivotkey<=num[high]){//由high处向前找小于Pivotkey的值,即是步骤2
    high--;
    }
    if(low<high){
    num[low]=num[high];
    low++;
    }
    while(low<high && num[low]<=Pivotkey){//由low处向后找大于Pivotkey的值,即是步骤3
    low++;
    }
    if(low<high){
    num[high]=num[low];
    high--;
    }
    }
    num[low]=Pivotkey;
    //对完成一次排序后的数组进行排序
    if(lowborder<low-1){
    sort(lowborder,low-1);
    }
    if(high+1<highborder){
    sort(high+1,highborder);
    }
    }
    //输出排序后的结果
    public void display(){
    for(int i=0;i<n;i++){
    System.out.print(num[i]+" ");
    }
    System.out.println();
    }
    public static void main(String[] args) {
    String choose;
    System.out.println("选择排序的数组随机生成还是手动输入?(0:随机生成。    1:手动输入)");
    choose=input.nextLine();
    while(!choose.equals("0") && !choose.equals("1")){
    System.out.println("输入有误,请按照提示选择输入(0:随机生成。    1:手动输入)");
    choose=input.nextLine();
    }
    while(choose.equals("1")){
    sortFive sFive=new sortFive();
    sFive.init();
    sFive.sort(0, n-1);
    sFive.display();
    System.out.println("选择排序的数组随机生成还是手动输入?(0:随机生成。    1:手动输入        11:退出)");
    choose=input.nextLine();
    while(!choose.equals("0") && !choose.equals("1") && !choose.equals("11")){
    System.out.println("输入有误,请按照提示选择输入(0:随机生成。    1:手动输入           11:退出)");
    choose=input.nextLine();
    }
    if(choose.equals("11")){
    break;
    }
    }
    while(choose.equals("0")){
    System.out.println("请输入要排序的数组大小:");
    n=input.nextInt();
    sortFive sFive=new sortFive(n);
    sFive.sort(0, n-1);
    sFive.display();
    System.out.println("选择排序的数组随机生成还是手动输入?(0:随机生成。    1:手动输入        11:退出)");
    choose=input.nextLine();
    while(!choose.equals("0") && !choose.equals("1") && !choose.equals("11")){
    System.out.println("输入有误,请按照提示选择输入(0:随机生成。    1:手动输入           11:退出)");
    choose=input.nextLine();
    }
    if(choose.equals("11")){
    break;
    }
    }
    System.out.println("你已退出此程序!");
    }
    }


              • 附各个排序算法的比较图


     
  • 相关阅读:
    为什么测试人员需要了解代码逻辑、表结构
    http报文常见的请求头、响应头
    测试人如何做出一份好简历
    如何制定测试计划
    写SQL的套路
    我是如何理解对公信贷业务
    db2----实操篇
    Oracle----高级操作
    常见web中间件漏洞(二)Apache漏洞
    常见web中间件漏洞(一)IIS漏洞
  • 原文地址:https://www.cnblogs.com/xpfei/p/7450811.html
Copyright © 2020-2023  润新知