Java数据结构 快速排序

思想

快速排序的核心操作是划分,通过某个数据将原来排序表分成两部分,前面部分比该数小,后面数据比该数据大或相等,该位置就为某数据排序后的位置,即该数据完成排序。如果定义一个排序表的划分方法为:
int partition(int[] R,int low,int high); 其中,low,high表示将数据R的第low个数据到high个数据进行划分,返回到整数为划分后到支点存储的位置;快速排序在查找分支点位置的方法有多种,本题目的排序过程中,首先从右向左移动,搜索小于分支记录的第一个元素,再从左向右移动,搜索大于分支记录的第一个元素,交互该两个记录值,继续搜索,直到两个搜索点交汇,如果交汇点记录与分支记录相等,分支记录与交汇点数据不交换,分支位置为交汇位置; 完成划分方法后,通过递归调用完成快速排序:
void QuickSort(int[] R,int s,int t){
if(s<t){
int i=partition(R,s,t);
QuickSort(R,s,i-1);
QuickSort(R,i+1,t);
}
}
建议每次划分选择第一个元素为支点记录进行编程。给你到问题是,将标准输入的n个整数采用快速排序,并需要显示出每次划分分支点存储的位置,第一个数为0,分支点的输出顺序按照程序递归产生的分支点的先后进行输出,并完成该数据的排序。
输入:标准输入,输入的第一行为整数的个数n值,第二行为n个整数,每个整数之间为一个空格。
输出:标准输出,输出的第一行依次输出排序过程中使用的支点位置,每个输出数据之间使用一个空格隔开,第二行输出排序后的序列,每个输出数据之间使用一个空格隔开。
输入样例:
14
39 80 76 41 13 29 50 78 30 11 100 7 41 86
输出样例:
5 3 2 1 8 6 9 13 12 10
7 11 13 29 30 39 41 41 50 76 78 80 86 100

代码

package 数据结构;
import java.util.Scanner;


public class kuaisupaixu1 {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int n=sc.nextInt();
		int data[]=new int[n];
		for(int i=0;i<n;i++)     
			data[i]=sc.nextInt();
		QuickSort(data,0,n-1);
		System.out.println();
		for(int i=0;i<n;i++)
			System.out.print(data[i]+" ");
		}
	static void QuickSort(int[] R,int s,int t){
        if(s<t){
           int i=partition(R,s,t);
           QuickSort(R,s,i-1);
            QuickSort(R,i+1,t);
            /*
             * 本题目的排序过程中,首先从右向左移动,搜索小于分支记录的第一个元素,
             * 再从左向右移动,搜索大于分支记录的第一个元素,交互该两个记录值,
             * 继续搜索,直到两个搜索点交汇,如果交汇点记录与分支记录相等,
             * 分支记录与交汇点数据不交换,分支位置为交汇位置; 完成划分方法后,
             * 通过递归调用完成快速排序:
             */
       }
  }
	private static int partition(int[] data, int low, int high) {
		/*
		 * partition()方法:在基准元素左边的元素都小于基准元素,在基准元素右边的元素都大于等于基准元素。
         * 可以使用partition()方法解决以下常见的问题:
         *1)查找数组中出现次数超过数组长度一半的元素。
         *  eg:MoreThanHalfSize类中的getElementOfMoreThanHalfSizeByPartition方法。
         *2)查找数组中最小的(或最大的)k个数 或 查找数组中第k小(或第k大)的数。
         *优点:时间复杂度为O(n)
         *缺点:改变了原数组中元素的位置。
		 */
		int i=low;
		int j=high;
		int base=data[low];
		int temp;
		while(i<j){
			while((i<j)&&base<=data[j])
			       j--;
			while((i<j)&&base>=data[i])
				i++;
			if(i<j){   //temp<-->data[j]
				temp=data[i];
				data[i]=data[j];
				data[j]=temp;
			}
		}
		if(data[low]>data[i]){ //temp<-->data[i]
			temp=data[low];
			data[low]=data[i];
			data[i]=temp;
		}
	System.out.print(i+" ");
		return i;
	}

}

运行结果

这里是代码运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值