13、选择排序算法
选择排序算法:
每一趟从待排序的数据中选出最小(或最大)的一个元素,顺序放在已排好数列的最后,直到全部待排序的数据全部排序完成。选择排序是一种不稳定排序算法。此效率比冒泡效率要高一点。
假如有这样一个数组:[86,54,23,7,90,48,11,66],从小到大排:
第一次比较:记86(第一个数)为最小值,86跟54比较54小交换,再拿54与23比较23小交换,23与7比较7小交换,7与90比较7小不交换,7与48比较7小不交换,7与11比较7小不交换,7与66比较7小不交换,比较了7次;最后为:[7,86,54,23,90,48,11,66],第一个最小值得出。
第二次比较:记86(此时为第二个数)为最小值,86跟54比较54小交换,再拿54与23比较23小交换,23与90比较23小不交换,32与48比较23小不交换,23与11比较11小交换,11与66比较11小不交换,比较了6次;最后为:[7,11,86,54,90,48,23,66],第二个最小值得出。
第三次比较:记86(此时为第三个数)为最小值,86跟54比较54小交换,54跟90比较54小不交换,54跟48比较48小交换,48与32比较23小交换,23与66比较23小不交换,比较了5次;最后为:[7,11,23,86,90,54,48,66],第三个最小值得出。
第四次比较:记86(此时为第四个数)为最小值,86与90比较86小不交换,86与54比较54小交换,54与48比较48小交换,48与66比较48小不交换,比较了4次;最后为:[7,11,23,48,90,86,54,66],第四个最小值得出。
第五次比较:记90(此时为第五个数)为最小值。90与86比较86小交换,86与54比较54小交换,54于66比较54小不交换,比较了3次;最后为:[7,11,23,48,54,90,86,66],第五个最小值得出。
第六次比较:记90(此时为第六个数)为最小值,90与86比较86小交换,86与66比较66小交换,比较了2次;最后为:[7,11,23,48,54,66,90,86],第六个最小值得出。
第七次比较:记90(此时为第七个数)为最小值,90与86比较86小交换,比较了1次,最后为:[7,11,23,48,54,66,86,90],结束。
我们来实现这个算法:
public class a
{
public static void main(String[] args)
{
int[] nums = {86,54,23,7,90,48,11,66};
int len = nums.length;
int minIndex;//用于记录每次比较最小值的下标
for(int i = 0;i < len-1 ; i++)
{//控制轮数
minIndex = i;//每轮假设一个最小值下标
for(int j = i+1;j < len; j++)//i+1:每一轮都往上加了一次
{
if(nums[minIndex] > nums[j])
{
minIndex = j;
}
}
//判断需要交换的数是否为自己
if(minIndex != i)
{
nums[minIndex] = nums[i] + nums[minIndex];
nums[i] = nums[minIndex] - nums[i];
nums[minIndex] = nums[minIndex] - nums[i];
}
}
//输出结果
for(int x : nums)
{
System.out.print(x+" ");
//System.out.print("\t");
}
}
}