走进数据结构之排序(五)---直接选择排序

一、直接选择排序算法分析

第一趟从n个元素的数据序列中选出关键字最小/大的元素并放到最前/后位置,下一趟再从n-1个元素中选出最小/大的元素并放到次前/后位置,以此类推,经过n-1趟完成排序。

二、代码实现

package top.einino.selectsort;

public class StraightSelectSort {

//交换keys[i]与keys[j]元素,i、j范围由调用者控制
private static void swap(int[] keys, int i, int j){
int temp = keys[j];
keys[j] = keys[i];
keys[i] = temp;
}

//默认升序
public static void selectSort(int[] keys){
selectSort(keys, true);
}
//直接选择排序:asc为true表示升序,asc为false表示降序
public static void selectSort(int[] keys, boolean asc){
//n-1趟排序
for(int i=0; i       int minormax = i;
//升序(降序)每趟在从keys[i]开始的子序列中寻找最小(最大)位置
for(int j=i+1; j
                if((asc?keys[j]keys[minormax])){
                    //minormax记住本趟最小或最大的元素下标
                    minormax = j;
                }
}
//将本趟最小或最大元素交换到前边
     if(minormax!=i){
                swap(keys, i, minormax);
            }
System.out.print("第"+(i+1)+"趟     ");
print(keys);
}
}

//输出排序数组
private static void print(int[] keys) {
for(int key : keys){
System.out.print(key+" ");
}
System.out.println();
}
public static void main(String[] args) {
int[] keys = {38, 97, 26, 19, 38, 15};
//测试升序
selectSort(keys);
//测试降序
int[] keys2 = {38, 97, 26, 19, 38, 15};
selectSort(keys2, false);
}
}

三、形象的小例子

这周就都有体育课了!

体育老师又来排队了!

初始队列:A学生138、B学生197、C学生126、D学生119、E学生138、F学生115

老师开始第一趟排序,老师先拉出A学生,并将A学生标记为最矮的,然后与B学生进行比较,结果AC,这时老师将C学生标记为最矮的,并把A学生排到原来的位置,将C学生拉出队伍,与D学生进行比较,结果C>D,这时老师把D学生标记为最矮的,把C学生排到原来的位置,将D学生拉出队伍,与E学生进行比较,结果DF,所以将D学生排到原来的位置,这时F学生已是最后一个了,所以这时会将F学生与第一位学生进行互换位置,这时A学生排到F学生的位置,F学生排到A学生的位置。结束第一趟排序,排序结果为F学生115、B学生197、C学生126、D学生119、E学生138、A学生138,并且F学生不再参与接下来的排序

老师开始第二趟排序,同样的道理,同样的比较规则,这时会将D学生与B学生进行互换位置,最终结果为F学生115、D学生119、C学生126、B学生197、E学生138、A学生138,并且F学生和D学生不再参与接下来的排序

同样的过程,第三趟排序的结果:F学生115、D学生119、C学生126、B学生197、E学生138、A学生138

第四趟排序的结果:F学生115、D学生119、C学生126、E学生138B学生197、A学生138

第四趟排序的结果:F学生115、D学生119、C学生126、E学生138A学生138B学生197

四、直接选择排序的时间复杂度

直接选择排序的比较次数与数据序列的初始排列无关,第i趟排序的比较次数是n-i,移动次数与初始排列有关,排序序列移动0次;反序排列的数据序列,每趟排序都要交换,移动3(n-1)次。算法总比较次数n^2/2,时间复杂度为O(n^2)

五、直接选择排序的空间复杂度

直接选择排序的空间复杂度为O(1)

六、稳定性

在直接选择排序算法中,会错过关键字相等的比较,比如上面的例子A学生138、E学生138、但是A学生138在排序过程中,直接与后面的F学生115进行互换位置,直接把A学生的位置跳到F学生位置的位置,并且是在E学生位置,导致到后面即使再遇到与E学生的比较,也不会再跳回B学生的前面了,导致关键字相等的元素在最后的结果发生的顺序的改变,所以直接选择算法是不稳定的。

七、小结

本博文从直接选择排序算法分析,升序和降序代码实现,老师排队的例子讲演,时间复杂度,空间复杂度以及稳定性介绍了直接选择排序的方方面面。

如果有疑问或者对该博文有何看法或建议或有问题的,欢迎评论,恳请指正!


 

你可能感兴趣的:(数据结构)