持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
选择排序
基本思路
选择排序在每一趟排序(i趟),就需要在n-i+1个待排序元素中选取关键字最小的元素,当待排序元素还剩下一个时,则可以结束排序。如果有n个元素,只需要进行n-1趟就可以使整个排序有序。他和前面的冒泡,快速排序一样,排序一次就可以确定 一个数的最终位置。如下图为手动模拟排序过程
代码
选择排序代码是比较容易理解的,一个双层循环,外层循环时循环排序的趟数,内循环时找每一趟中待排序元素中的最小数据。
public void selectionSort() {
DataNode tempNode;
int tempIndexForSmallest;
for (int i = 0; i < length - 1; i++) {
// Initialize.
tempNode = data[i];
tempIndexForSmallest = i;
for (int j = i + 1; j < length; j++) {
if (data[j].key < tempNode.key) {
tempNode = data[j];
tempIndexForSmallest = j;
}
}
// Change the selected one with the current one.
data[tempIndexForSmallest] = data[i];
data[i] = tempNode;
}
}
运行结果:
-------selectionSortTest-------
I am a data array with 7 items.
(5, if) (3, then) (6, else) (10, switch) (7, case) (1, for) (9, while)
Result
I am a data array with 7 items.
(1, for) (3, then) (5, if) (6, else) (7, case) (9, while) (10, switch)
时间复杂度
选择排序,无论是否是顺序或者是逆序,他的时间复杂度都是O(n^2),因为我们知道选择排序他的过程是一次排序是去未排序的关键字中找出最大或者最小,所以不管是否有序都需要进行同样的操作,而相比与插入排序,插入排序 如果是顺序的和逆序的两种情况下,时间复杂度是不同的。
总结:
今天学习的选择排序,相比之前冒泡排序,选择排序一趟排序,只需要交换一次位置,而冒泡排序交换位置则要更频繁一点。在查找与排序相关算法中,我觉得一定要对比每一个算法他们的适用情况,以及他们之间的联系和区别。