午夜学徒xpf的博客

个人学习笔记

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


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


阅读更多
版权声明:原创文章,转载请注明出处。 https://blog.csdn.net/Xing_Pengfei/article/details/60321965
个人分类: Java
上一篇【Java】五种常见排序之----------------归并排序
下一篇不使用第三个变量的情况下,实现两个变量间的互换。
想对作者说点什么? 我来说一句

五种常见排序法的比较

2010年06月01日 4KB 下载

没有更多推荐了,返回首页

关闭
关闭