Question:实现选择排序(java)
题目:

解一:核心思路(选择排序):每一轮从待排序元素中找到“最值”(最大或最小,该题中为升序排序,所有为最小),将其放到当前轮的“目标位置”,重复此过程直到所有元素有序。
具体操作:1、分区域:把数组分成 “已排序区” 和 “未排序区”(初始时已排序区为空,未排序区是整个数组)。2、找最值:在未排序区中找到最小元素,记录它的下标。3、交换位置:将这个最小元素和 “未排序区的第一个元素” 交换位置,此时该元素被纳入已排序区。4、缩小范围:未排序区的范围缩小(排除已放入已排序区的元素),重复步骤 2~3,直到未排序区只剩 1 个元素(自动有序)。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n=scan.nextInt();
int arr[]=new int[n];
for(int i=0;i<arr.length;i++)
{
arr[i]=scan.nextInt();
}
scan.close();
for(int i=0;i<arr.length-1;i++)
{
int min=arr[i];
int minIndex=i;
for(int j=i+1;j<arr.length;j++)
{
if(min>arr[j])
{
min=arr[j];
minIndex=j;
}
}
if(minIndex!=i)
{
arr[minIndex]=arr[i];
arr[i]=min;
}
}
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int x[] = new int[n];
for (int i =0;i<x.length;i++){
x[i] = scanner.nextInt();
}
for (int i = 0;i<x.length;i++){
for (int j = i;j<x.length;j++){
if (x[i]>x[j]){
int temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
}
for (int i = 0;i<n;i++){
System.out.print(x[i]+" ");
}
scan.close();
}
}
解二:调用Arrays.sort()方法。获取目标数组,调用该方法排序进行输出。
import java.util.Scanner;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num=scan.nextInt();
int[] arr=new int[num];
for(int i=0;i<num;i++){
arr[i]=scan.nextInt();
}
Arrays.sort(arr);
for(int i:arr){
System.out.printf("%d ",i);
}
scan.close();
}
}
解三:该解法使用了快速排序的思想。快速排序的基本思路是在待排序的n个元素(无序区)中任取一个元素(通常取首元素)作为基准(该解法中基准为p),把该元素放入最终位置后(称为基准归为),整个数据序列被基准分割成两个序列(“(arr,left,p-1)”和“(arr,p+1,right)”),所有不大于基准的元素放置在前面子序列(无序区1)中,所有不小于基准的元素放置在后面子序列(无序区2)中,并把基准排在这两个子序列的中间,这个过程称作划分(具体步骤为partition方法里的代码)。然后对两个子序列分别重复上述过程,直到每个子序列内只有一个元素或子序列为空为止(判断对应的是quicksort方法里if判断语句right>left,只有一个元素或子序列为空则为right<=left,届时返回该已排序完成的数组)。
这是一种二分法思想,每次将整个无序区一分为二,归位一个元素,对两个子序列采用同样的方式进行排序,直到子序列长度为1或0为止。
import java.util.Scanner;
public class Made {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] arr = new int[n];
for(int i=0;i<n;i++){
arr[i] = scan.nextInt();
}
quicksort(arr,0,n-1);
for(int i=0;i<n;i++){
System.out.print(arr[i] + " ");
}
scan.close();
}
public static int[] quicksort(int[] arr,int left,int right){
if(right>left){
int p = partition(arr,left,right);
quicksort(arr,left,p-1);
quicksort(arr,p+1,right);
}
return arr;
}
public static int partition(int[] arr,int left,int right){
int pviot = arr[right];//确定基准数
int pviots = right;//基准数的下标
while(right>left)
{
while(right>left&&arr[left]<=pviot) left++;//循环跳出时要么就是left>=right或者找到一个大于基准数的值pviot
while(right>left&&arr[right]>=pviot) right--;//循环跳出时要么就是left>=right或者找到一个小于基准数的值pviot
if(right>left) swap(arr,left,right);//俩个循环结束出现arr[left]>=pviot>=arr[right]的情况,这个时候交换arr[left]和arr[right]以实现arr[left]<=pviot<=arr[right]
else swap(arr,left,pviots);//这个时候是left>=right的情况,这个时候arr[left]>=pviot恒成立,因为left>=right说明它们已经相遇过了,在他们相遇的地方就是新pviot产生的地方,所以这个时候arr[left]>=pviot恒成立,这个时候只需要将pviot和arr[left]进行交换即可
}
return left;
}
public static void swap(int[] arr,int l,int r){
int t = arr[l];
arr[l] = arr[r];
arr[r] = t;
}
}
更多推荐


所有评论(0)