Java使用快速排序法对数组从小到大排序

给定值的快速排序`

import java.util.*;
public class Program_kuaipai 
{
	
	public static void main(String[] args) 
	{
		String str = "12 34 1 -5 9 100 55 0";
		String[] numStrs = str.split(" ");
		int[] numArray = new int[numStrs.length];
		for(int i=0;i<numStrs.length;i++)
		{
			numArray[i] = Integer.valueOf(numStrs[i]);
		}
		quickSort(numArray);//快速排序
		/*for(int i=0;i<numStrs.length;i++)
		{
			System.out.println(numArray[i]);
		}*///用for循环输出整形数组
		System.out.println(Arrays.toString(numArray));//用Arrays.toString()输出
	}
	public static void quickSort(int[] numArray)
	{
		if(numArray.length>0) 
		{
			quickSort(numArray,0,numArray.length-1);
		}
	}
	private static void quickSort(int[] numArray,int left,int right)
	{
		if(left>right)
		{
			return;
		}
		int i=left;
		int j=right;
		int sentry=numArray[left];//找一个“哨兵”
		//int sentry=numArray[(i+j)/2];
		while(i<j)
		{
			while(i<j&&numArray[j]>sentry)//从右向左找一个比“哨兵”小的值
			{
				j--;
			}
			while(i<j&&numArray[i]<=sentry)//从左向右找一个比“哨兵”大的值
			{
				i++;
			}
			if(i<j)//将两个值交换位置
			{
				int mid=numArray[i];
				numArray[i]=numArray[j];
				numArray[j]=mid;
			}
		}
		int mid=numArray[i];
		numArray[i]=numArray[left];
		numArray[left]=mid;//改变“哨兵”的位置
		quickSort(numArray, left, i-1 );//递归,将左部分再次进行快排
		quickSort(numArray, i+1, right );//递归,将右部分再次进行快排
	}
}

在这里插入图片描述
可输入值的快速排序:

import java.util.*;
public class Program_kuaipai
{
	
	public static void main(String[] args) 
	{
		Scanner scan = new Scanner(System.in);
		String str = scan.nextLine();//输入需要排序的数字
		String[] numStrs = str.split(" ");
		int[] numArray = new int[numStrs.length];
		for(int i=0;i<numStrs.length;i++)
		{
			numArray[i] = Integer.valueOf(numStrs[i]);
		}
		quickSort(numArray);//快速排序
		/*for(int i=0;i<numStrs.length;i++)
		{
			System.out.println(numArray[i]);
		}*///用for循环输出整形数组
		//Arrays.sort(numArray);//用Arrays.sort()的排序
		System.out.println(Arrays.toString(numArray));//用Arrays.toString()输出
	}
	public static void quickSort(int[] numArray)
	{
		if(numArray.length>0) 
		{
			quickSort(numArray,0,numArray.length-1);
		}
	}
	private static void quickSort(int[] numArray,int left,int right)
	{
		if(left>right)
		{
			return;
		}
		int i=left;
		int j=right;
		int sentry=numArray[left];//找一个“哨兵”
		while(i<j)
		{
			while(i<j&&numArray[j]>sentry)//从右向左找一个比“哨兵”小的值
			{
				j--;
			}
			while(i<j&&numArray[i]<=sentry)//从左向右找一个比“哨兵”大的值
			{
				i++;
			}
			if(i<j)//将两个值交换位置
			{
				int mid=numArray[i];
				numArray[i]=numArray[j];
				numArray[j]=mid;
			}
		}
		int mid=numArray[i];
		numArray[i]=numArray[left];
		numArray[left]=mid;//改变“哨兵”的位置
		quickSort(numArray, left, i-1 );//递归,将左部分再次进行快排
		quickSort(numArray, i+1, right );//递归,将右部分再次进行快排
	}
}

在这里插入图片描述

好的,下面是利用快速排序算法将读入的 n 个数从小到大排序后输出的 JAVA 代码: ```java import java.util.Scanner; public class QuickSort { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] nums = new int[n]; for (int i = 0; i < n; i++) { nums[i] = scanner.nextInt(); } quickSort(nums, 0, n - 1); for (int i = 0; i < n; i++) { System.out.print(nums[i] + " "); } } public static void quickSort(int[] nums, int left, int right) { if (left < right) { int pivotIndex = partition(nums, left, right); quickSort(nums, left, pivotIndex - 1); quickSort(nums, pivotIndex + 1, right); } } public static int partition(int[] nums, int left, int right) { int pivot = nums[left]; int i = left + 1; int j = right; while (i <= j) { while (i <= j && nums[i] <= pivot) { i++; } while (i <= j && nums[j] > pivot) { j--; } if (i < j) { swap(nums, i, j); } } swap(nums, left, j); return j; } public static void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } ``` 这段代码中,我们先读入 n 个数,然后利用快速排序算法将它们从小到大排序,最后输出排序后的结果。具体来说,我们定义了一个 quickSort 函数和一个 partition 函数,其中 quickSort 函数用来递归地对数组进行分区,而 partition 函数则用来对数组进行一次划分。在 partition 函数中,我们首先选取一个基准元素,然后利用两个指针 i 和 j 分别从数组的左右两端开始向中间扫描,直到它们相遇。在扫描时,如果 i 指向的元素小于等于基准元素,就向右移动 i 指针;如果 j 指向的元素大于基准元素,就向左移动 j 指针;如果 i 和 j 指向的元素都不符合要求,就交换它们。最后,我们将基准元素与 j 指向的元素交换位置,以保证基准元素左边的元素都比它小,右边的元素都比它大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值