Java实现快速排序

本文介绍了一种高效的排序算法——快速排序。它采用分而治之的策略,通过选择一个基准值并分割数据,使得小于基准的元素位于左侧,大于基准的位于右侧。在平均和最好情况下,快速排序的时间复杂度为O(nlog2n),但最坏情况下可能达到O(n^2)。该算法不是稳定的排序方法。文章通过一个Java程序展示了如何实现快速排序,包括输入数组、排序过程展示及递归排序左右子数组的过程。
摘要由CSDN通过智能技术生成

快速排序(QuickSort)又称分割交换排序,是目前公认最佳的排序法,也是使用“分而治之”的方式,先会在数据中找到一个虚拟的中间值,并按此中间值将所有打算排序的数据分为两部分,其中小于中间值的数据放在左边而大于中间值的数据放在右边,再以同样的方式分别处理左右两边的数据,直到排序完为止。
1.在最快和平均情况下,时间复杂度为O(nlog2n)。最坏情况就是每次挑中的中间值不是最大就是最小,因而最坏的情况下时间复杂度为O(n^2)。
2.快速排序法不是稳定排序法。
3.在最差的情况下,空间复杂度为O(n),而最佳情况为O(log2n)。
4.快速排序法是平均运行时间最快的排序法。
分割步骤:
1.先假设K的值为第一个键值
2.从左往右找出Ki>K的键值Ki
3.从右往左找出Kj<K的键值Kj
4.如果i<j,那么Ki与Kj互换,并返回到步骤2
5.若i>=j,那么将K与Kj交换,并以j位置为基准点分割成左右部分。然后再针对左右两边进行步骤1至步骤5,直到左半边键值=右半边键值为止(i=j)。

package Sort;
import java.io.*;
import java.util.*;
//设计一个Java程序,输入数列的个数,并使用随机生成数值,再使用快速排序法进行排序。
public class QuickSort extends Object{
	int size;
	int process=0;
	int data[]=new int[10];
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		QuickSort test=new QuickSort();
		System.out.print("请输入数组大小(10)以下:");
		try {
			InputStreamReader isr=new InputStreamReader(System.in);
			BufferedReader br=new BufferedReader(isr);
			test.size=Integer.parseInt(br.readLine());
		}catch(Exception e) {}
		test.inputarr();
		System.out.print("原始数据:");
		test.showdata();
		test.quick(test.data, test.size, 0, test.size-1);
		
	}
	void inputarr() {
		Random rand=new Random();
		int i;
		for(i=0;i<size;i++) {
			data[i]=(Math.abs(rand.nextInt(99)))+1;
		}
	}
	void showdata() {
		int i;
		for(i=0;i<size;i++) {
			System.out.print(data[i]+" ");
		}
		System.out.println();
	}
	void quick(int d[],int size,int lf,int rg) {
		int i,j,temp;
		int lf_idx;
		int rg_idx;
		int t;
		if(lf<rg) {
			lf_idx=lf+1;
			rg_idx=rg;
			while(true) {
				System.out.print("处理过程"+(process++)+":  ");
				for(t=0;t<size;t++) {
					System.out.print(+d[t]+" ");
				}
				System.out.println();
				for(i=lf+1;i<=rg;i++) {
					if(d[i]>=d[lf]) {
						lf_idx=i;
						break;
					}
					lf_idx++;
				}
				for(j=rg;j>=lf+1;j--) {
					if(d[j]<=d[lf]) {
						rg_idx=j;
						break;
					}
					rg_idx--;
				}
				if(lf_idx<rg_idx) {
					temp=d[lf_idx];
					d[lf_idx]=d[rg_idx];
					d[rg_idx]=temp;
				}else {
					break;
				}
			}
			if(lf_idx>=rg_idx) {
				temp=d[lf];
				d[lf]=d[rg_idx];
				d[rg_idx]=temp;
				quick(d,size,lf,rg_idx-1);
				quick(d,size,rg_idx+1,rg);
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值