-
原理: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的值,即是步骤2high--;}if(low<high){num[low]=num[high];low++;}while(low<high && num[low]<=Pivotkey){//由low处向后找大于Pivotkey的值,即是步骤3low++;}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("你已退出此程序!");}}
- 附各个排序算法的比较图