- 什么是选择排序?
它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 - 实战
有这样一个数组
int arr[]={ 2,5,1,4,3,6 }
选择排序是这样排的:
虚拟一个临时变量,int max = 0 <代表0号位置上存放的是最大值>
第1次比较
首先假定 第一个位置上的数为最大值,那就是2,此时记录的max最大值的位置号还是0 。
在arr数值中,2<5,所以此时的max记录的位置号就是 1号位了。继续拿max记录位置所代表的最大值与其后位置上的数依次比较,最后确定max记录的位置号为5,值为 6 。-》 max=5。
在arr数组中,由于记录的位置号的最大值是在5号位置,所以需要与0号位置上的值做交换。
此时的arr 数组 为 { 6,5,1,4,3,2 }
第2次比较
由于在0号位置上已经确定了最大值,所以不需要在做比较。直接从 1 号位置开始比较起。此时max记录的最大值的位置号就是1,值是5.拿5这个值依次与其后的数做比较。发现值5已经是最大了,不需要交换。因此此时 arr 数组还是这样的:
{ 6,5,1,4,3,2 }
以此类推
第3次比较 arr 数组是 { 6,5,4,1,3,2}
第4次比较 arr 数组是 { 6,5,4,3,1,2}
第5次比较 arr 数组是 { 6,5,4,3,2,1}
在这个数组 arr 中 的长度是6 ,一共比较了5次。
3 代码
首先需要比较多少次:
for(int i = 0 ;i<arr.length -1 ;i++){}
虚拟一个临时变量 int max, 假设 i 位置的是最大值
int max = i;
开始与其后的数做比较,如果后一位置的值大于虚拟变量记录的位置的值,就改变max记录的位置
for(int j=i+1;j<arr.lenth;j++){
if(arr[max]<arr[j]){
max=j;
}
判断max记录的位置号是不是原始记录的位置号,如果不是,就交换位置所代表的值。
if(i!=max){
int temp=arr[max];
arr[max]=arr[i];
arr[i] = temp;
}
最终完整版:
int arr[] ={ 2,5,1,4,3,6};
for(int i=0;i<arr.length-1;i++ ){
int max=i;
for(int j=i+1;j<arr.length;j++){
if(arr[max]<arr[j]){
max=j;
}
}
if(i!=max){
int temp=arr[max];
arr[max]=arr[i];
arr[i]=temp;
}
}
补张图:
结束,收工。