一、用java实现直接选择排序
1、什么是直接选择排序呢?
就好比打扑克,当你把牌都摸到手里后,开始整理先从第一张开始理,通过从第一张到最后一张比,把最小的放到最左边,以此类推。
2、优化
寻常的直接选择排序是选小的逐渐往左边排列或者选大的往右边排,为了提高效率我们不妨优化一下此类型排列,直接左右开工(最大最小同时选择)
具体代码实现如下
import java.util.Scanner;
class sq{
public static void main(String[] arrgs){
int a[]=new int[5];
int num=a.length;
//区间
int begin=0;
int end=num-1;
Scanner sc=new Scanner(System.in);
for(int i=0;i<a.length;i++){
a[i]=sc.nextInt();
}
while(end>begin){
int min=begin;
int max=begin;
for(int i=begin+1;i<=end;i++){
if(a[i]<a[min]){
min=i;
}
if(a[i]>a[max]){
max=i;
}
}
//
int tmp_1=0;
tmp_1=a[begin];
a[begin]=a[min];
a[min]=tmp_1;
if(max==begin){
max=min;
}
//
int tmp_2=0;
tmp_2=a[end];
a[end]=a[max];
a[max]=tmp_2;
end--;
begin++;
}
int tmp=0;
for(tmp=0;tmp<num;tmp++){
System.out.print(a[tmp]+" ");
}
System.out.println();
}
}
思路:
-
我们先定义两个区间分别是
begin
和end
,每当我们把相对最大最小选出来,我们就缩小区间在小区间接着进行左右开弓排序,当区间满足begin>=end
时我就排好顺序了。 -
左右开弓时我们需要定义两个变量
max
min
分别存放每次筛选时的最大最小值,在定义变量i在不断缩小的区间里来遍历查找最大最小值 -
需要注意的是当我们把最小值交换到区间的第一个位置时,恰巧第一个位置又是最大值,因此我们需要在交换完最小值到最左边后,在判断一下最大值对应的max的是否是begin,如果是,那么交换后之前begin对应的值就换到了现在min的位置了,需要
max=min
一下。