目录
选择排序(原始版)、选择排序(递归版)、选择排序(优化版)、选择排序(优化递归版)
1、选择排序概述
选择排序是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,继续放在起始位置知道未排序元素个数为0。
原理
1>首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
2>再从剩余未排序元素中继续寻找最小(大)元素,然后放到未排序序列的起始位置。
3>重复第二步,直到所有元素均排序完毕。
2、选择排序分类
选择排序(原始版)、选择排序(递归版)、选择排序(优化版)、选择排序(优化递归版)
3、代码展示和运行结果
public static void main(String[] args) {
System.out.println("选择排序(原始版)"+" 数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43");
int[] sum= new int[]{4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43};
sort(sum);
System.out.println("选择排序(递归版)"+" 数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43");
int[] sum1= new int[]{4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43};
sort1(sum1,0,sum1.length,0);
System.out.println("选择排序(优化版)"+" 数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43");
int[] sum2= new int[]{4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43};
sort2(sum2);
System.out.println("选择排序(优化递归版)"+" 数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43");
int[] sum3= new int[]{4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43};
sort3(sum3,0,sum3.length);
}
选择排序(原始版)
代码:
public static void sort(int[]num){
if(num.length<2||num==null)return;
int index=0;//标记最小值处
int count=0;//循环次数
int count1=0;//交换次数
for (int i = 0; i < num.length-1; i++) {
index=i;
for (int j = i; j <num.length ; j++) {
count++;
if(num[j]<num[index])index=j;//发现更小值,获取下标
}
if(i!=index){//交换
count1++;
int c=num[i];
num[i]=num[index];
num[index]=c;
System.out.print("交换了"+num[i]+"和"+num[index]+"结果:");
}
for (int m = 0; m < num.length; m++) {
System.out.print(num[m]+",");
}
System.out.println();
}
System.out.println("循环次数"+count+"交换次数"+count1);
}
运行结果:
选择排序(原始版) 数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43
交换了1和4结果:1,4,6,77,33,45,55,90,30,67,3,4,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43,
交换了2和4结果:1,2,6,77,33,45,55,90,30,67,3,4,4,3,4,5,6,68,98,99,76,65,66,33,43,32,43,
交换了3和6结果:1,2,3,77,33,45,55,90,30,67,6,4,4,3,4,5,6,68,98,99,76,65,66,33,43,32,43,
交换了3和77结果:1,2,3,3,33,45,55,90,30,67,6,4,4,77,4,5,6,68,98,99,76,65,66,33,43,32,43,
交换了4和33结果:1,2,3,3,4,45,55,90,30,67,6,33,4,77,4,5,6,68,98,99,76,65,66,33,43,32,43,
交换了4和45结果:1,2,3,3,4,4,55,90,30,67,6,33,45,77,4,5,6,68,98,99,76,65,66,33,43,32,43,
交换了4和55结果:1,2,3,3,4,4,4,90,30,67,6,33,45,77,55,5,6,68,98,99,76,65,66,33,43,32,43,
交换了5和90结果:1,2,3,3,4,4,4,5,30,67,6,33,45,77,55,90,6,68,98,99,76,65,66,33,43,32,43,
交换了6和30结果:1,2,3,3,4,4,4,5,6,67,30,33,45,77,55,90,6,68,98,99,76,65,66,33,43,32,43,
交换了6和67结果:1,2,3,3,4,4,4,5,6,6,30,33,45,77,55,90,67,68,98,99,76,65,66,33,43,32,43,
1,2,3,3,4,4,4,5,6,6,30,33,45,77,55,90,67,68,98,99,76,65,66,33,43,32,43,
交换了32和33结果:1,2,3,3,4,4,4,5,6,6,30,32,45,77,55,90,67,68,98,99,76,65,66,33,43,33,43,
交换了33和45结果:1,2,3,3,4,4,4,5,6,6,30,32,33,77,55,90,67,68,98,99,76,65,66,45,43,33,43,
交换了33和77结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,55,90,67,68,98,99,76,65,66,45,43,77,43,
交换了43和55结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,90,67,68,98,99,76,65,66,45,55,77,43,
交换了43和90结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,67,68,98,99,76,65,66,45,55,77,90,
交换了45和67结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,68,98,99,76,65,66,67,55,77,90,
交换了55和68结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,98,99,76,65,66,67,68,77,90,
交换了65和98结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,99,76,98,66,67,68,77,90,
交换了66和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,76,98,99,67,68,77,90,
交换了67和76结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,98,99,76,68,77,90,
交换了68和98结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,99,76,98,77,90,
交换了76和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,99,98,77,90,
交换了77和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,98,99,90,
交换了90和98结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,90,99,98,
交换了98和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,90,98,99,
循环次数377交换次数25
选择排序(递归版)
代码:
public static void sort1(int[] num,int m,int length,int count){
if(length<2)return;
int index=m;//标记最小值
for (int i = m; i < length+m; i++) {
count++;
if(num[i]<num[index])index=i;//发现更小值,获取下标
}
if(index!=0){//交换
int c=num[m];
num[m]=num[index];
num[index]=c;
System.out.print("交换了"+num[m]+"和"+num[index]+"结果:");
}
for (int n = 0; n < num.length; n++) {
System.out.print(num[n]+",");
}
System.out.println("递归次数:"+m+"循环次数:"+count);
sort1(num,m+1,--length,count);
}
运行结果:
选择排序(递归版) 数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43
交换了1和4结果:1,4,6,77,33,45,55,90,30,67,3,4,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43,递归次数:0循环次数:27
交换了2和4结果:1,2,6,77,33,45,55,90,30,67,3,4,4,3,4,5,6,68,98,99,76,65,66,33,43,32,43,递归次数:1循环次数:53
交换了3和6结果:1,2,3,77,33,45,55,90,30,67,6,4,4,3,4,5,6,68,98,99,76,65,66,33,43,32,43,递归次数:2循环次数:78
交换了3和77结果:1,2,3,3,33,45,55,90,30,67,6,4,4,77,4,5,6,68,98,99,76,65,66,33,43,32,43,递归次数:3循环次数:102
交换了4和33结果:1,2,3,3,4,45,55,90,30,67,6,33,4,77,4,5,6,68,98,99,76,65,66,33,43,32,43,递归次数:4循环次数:125
交换了4和45结果:1,2,3,3,4,4,55,90,30,67,6,33,45,77,4,5,6,68,98,99,76,65,66,33,43,32,43,递归次数:5循环次数:147
交换了4和55结果:1,2,3,3,4,4,4,90,30,67,6,33,45,77,55,5,6,68,98,99,76,65,66,33,43,32,43,递归次数:6循环次数:168
交换了5和90结果:1,2,3,3,4,4,4,5,30,67,6,33,45,77,55,90,6,68,98,99,76,65,66,33,43,32,43,递归次数:7循环次数:188
交换了6和30结果:1,2,3,3,4,4,4,5,6,67,30,33,45,77,55,90,6,68,98,99,76,65,66,33,43,32,43,递归次数:8循环次数:207
交换了6和67结果:1,2,3,3,4,4,4,5,6,6,30,33,45,77,55,90,67,68,98,99,76,65,66,33,43,32,43,递归次数:9循环次数:225
交换了30和30结果:1,2,3,3,4,4,4,5,6,6,30,33,45,77,55,90,67,68,98,99,76,65,66,33,43,32,43,递归次数:10循环次数:242
交换了32和33结果:1,2,3,3,4,4,4,5,6,6,30,32,45,77,55,90,67,68,98,99,76,65,66,33,43,33,43,递归次数:11循环次数:258
交换了33和45结果:1,2,3,3,4,4,4,5,6,6,30,32,33,77,55,90,67,68,98,99,76,65,66,45,43,33,43,递归次数:12循环次数:273
交换了33和77结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,55,90,67,68,98,99,76,65,66,45,43,77,43,递归次数:13循环次数:287
交换了43和55结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,90,67,68,98,99,76,65,66,45,55,77,43,递归次数:14循环次数:300
交换了43和90结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,67,68,98,99,76,65,66,45,55,77,90,递归次数:15循环次数:312
交换了45和67结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,68,98,99,76,65,66,67,55,77,90,递归次数:16循环次数:323
交换了55和68结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,98,99,76,65,66,67,68,77,90,递归次数:17循环次数:333
交换了65和98结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,99,76,98,66,67,68,77,90,递归次数:18循环次数:342
交换了66和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,76,98,99,67,68,77,90,递归次数:19循环次数:350
交换了67和76结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,98,99,76,68,77,90,递归次数:20循环次数:357
交换了68和98结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,99,76,98,77,90,递归次数:21循环次数:363
交换了76和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,99,98,77,90,递归次数:22循环次数:368
交换了77和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,98,99,90,递归次数:23循环次数:372
交换了90和98结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,90,99,98,递归次数:24循环次数:375
交换了98和99结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,90,98,99,递归次数:25循环次数:377
选择排序(优化版)
代码:
public static void sort2(int[]num){
if(num.length<2||num==null)return;
int left,right;//标记左右
int min,max;//标记最大和最小值
left=0;
right=num.length-1;
int m=0;
while (left<right){
min=left;
max=right;
for (int i = left; i <right+1 ; i++) {
m++;
if(num[i]<=num[min])min=i;//扫描获得最小值下标
if(num[i]>=num[max])max=i;//扫描获得最大值下标
}
if(min!=left){
int c=num[left];
num[left]=num[min];
num[min]=c;
System.out.print("交换了"+num[left]+"和"+num[min]+"结果:");
}
if(max==left)min=max;
if(max!=right){
int c=num[right];
num[right]=num[max];
num[max]=c;
System.out.print("交换了"+num[right]+"和"+num[max]+"结果:");
}
left++;
right--;
for (int n = 0; n < num.length; n++) {
System.out.print(num[n]+",");
}
System.out.println("循环次数"+m);
}
}
运行结果:
选择排序(优化版) 数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43
交换了1和4结果:交换了99和43结果:1,4,6,77,33,45,55,90,30,67,3,4,2,3,4,5,6,68,98,43,76,65,66,33,43,32,99,循环次数27
交换了2和4结果:交换了98和32结果:1,2,6,77,33,45,55,90,30,67,3,4,4,3,4,5,6,68,32,43,76,65,66,33,43,98,99,循环次数52
交换了3和6结果:交换了90和43结果:1,2,3,77,33,45,55,43,30,67,3,4,4,6,4,5,6,68,32,43,76,65,66,33,90,98,99,循环次数75
交换了3和77结果:交换了3和33结果:1,2,3,33,33,45,55,43,30,67,77,4,4,6,4,5,6,68,32,43,76,65,66,3,90,98,99,循环次数96
交换了4和33结果:交换了77和66结果:1,2,3,33,4,45,55,43,30,67,66,4,4,6,33,5,6,68,32,43,76,65,77,3,90,98,99,循环次数115
交换了4和45结果:交换了76和65结果:1,2,3,33,4,4,55,43,30,67,66,4,45,6,33,5,6,68,32,43,65,76,77,3,90,98,99,循环次数132
交换了4和55结果:交换了68和65结果:1,2,3,33,4,4,4,43,30,67,66,55,45,6,33,5,6,65,32,43,68,76,77,3,90,98,99,循环次数147
交换了5和43结果:交换了67和43结果:1,2,3,33,4,4,4,5,30,43,66,55,45,6,33,43,6,65,32,67,68,76,77,3,90,98,99,循环次数160
交换了6和30结果:交换了66和32结果:1,2,3,33,4,4,4,5,6,43,32,55,45,6,33,43,30,65,66,67,68,76,77,3,90,98,99,循环次数171
交换了6和43结果:1,2,3,33,4,4,4,5,6,6,32,55,45,43,33,43,30,65,66,67,68,76,77,3,90,98,99,循环次数180
交换了30和32结果:交换了55和32结果:1,2,3,33,4,4,4,5,6,6,30,32,45,43,33,43,55,65,66,67,68,76,77,3,90,98,99,循环次数187
交换了45和43结果:1,2,3,33,4,4,4,5,6,6,30,32,43,43,33,45,55,65,66,67,68,76,77,3,90,98,99,循环次数192
交换了33和43结果:交换了43和43结果:1,2,3,33,4,4,4,5,6,6,30,32,33,43,43,45,55,65,66,67,68,76,77,3,90,98,99,循环次数195
选择排序(优化递归版)
代码:
public static void sort3(int[] num,int m,int length){
if(length<2)return;
int index=m;//左标
int index1=num.length-m-1;//右标
for (int i = m; i < length; i++) {
if(num[i]<=num[index])index=i;//扫描获得最小值下标
}
if(index!=m){
int c=num[m];
num[m]=num[index];
num[index]=c;
System.out.print("交换了"+num[m]+"和"+num[index]+"结果:");
}
for (int i = m; i < length; i++) {
if(num[i]>=num[index1])index1=i;//扫描获得最大值下标
}
if(index1!=(num.length-m-1)){
int c=num[num.length-m-1];
num[num.length-m-1]=num[index1];
num[index1]=c;
System.out.print("交换了"+num[num.length-m-1]+"和"+num[index1]+"结果:");
}
for (int n = 0; n < num.length; n++) {
System.out.print(num[n]+",");
}
System.out.println("递归次数"+m);
if(m<(num.length-m-1)) sort3(num,m+1,--length);
}
运行结果:
选择排序(优化递归版) 数据:4,4,6,77,33,45,55,90,30,67,3,1,2,3,4,5,6,68,98,99,76,65,66,33,43,32,43
交换了1和4结果:交换了99和43结果:1,4,6,77,33,45,55,90,30,67,3,4,2,3,4,5,6,68,98,43,76,65,66,33,43,32,99,递归次数0
交换了2和4结果:交换了98和32结果:1,2,6,77,33,45,55,90,30,67,3,4,4,3,4,5,6,68,32,43,76,65,66,33,43,98,99,递归次数1
交换了3和6结果:交换了90和43结果:1,2,3,77,33,45,55,43,30,67,3,4,4,6,4,5,6,68,32,43,76,65,66,33,90,98,99,递归次数2
交换了3和77结果:交换了77和33结果:1,2,3,3,33,45,55,43,30,67,33,4,4,6,4,5,6,68,32,43,76,65,66,77,90,98,99,递归次数3
交换了4和33结果:交换了76和66结果:1,2,3,3,4,45,55,43,30,67,33,4,4,6,33,5,6,68,32,43,66,65,76,77,90,98,99,递归次数4
交换了4和45结果:交换了68和65结果:1,2,3,3,4,4,55,43,30,67,33,4,45,6,33,5,6,65,32,43,66,68,76,77,90,98,99,递归次数5
交换了4和55结果:交换了67和66结果:1,2,3,3,4,4,4,43,30,66,33,55,45,6,33,5,6,65,32,43,67,68,76,77,90,98,99,递归次数6
交换了5和43结果:交换了66和43结果:1,2,3,3,4,4,4,5,30,43,33,55,45,6,33,43,6,65,32,66,67,68,76,77,90,98,99,递归次数7
交换了6和30结果:交换了65和32结果:1,2,3,3,4,4,4,5,6,43,33,55,45,6,33,43,30,32,65,66,67,68,76,77,90,98,99,递归次数8
交换了6和43结果:交换了55和32结果:1,2,3,3,4,4,4,5,6,6,33,32,45,43,33,43,30,55,65,66,67,68,76,77,90,98,99,递归次数9
交换了30和33结果:交换了45和33结果:1,2,3,3,4,4,4,5,6,6,30,32,33,43,33,43,45,55,65,66,67,68,76,77,90,98,99,递归次数10
1,2,3,3,4,4,4,5,6,6,30,32,33,43,33,43,45,55,65,66,67,68,76,77,90,98,99,递归次数11
交换了33和33结果:交换了43和33结果:1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,90,98,99,递归次数12
1,2,3,3,4,4,4,5,6,6,30,32,33,33,43,43,45,55,65,66,67,68,76,77,90,98,99,递归次数13