【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]+"\t");
}
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]+"\t");
}
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]+"\t");
}
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("你已退出此程序!");
}
}


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值