目录
一. 选择排序的实现
1. 简单选择排序
2. 性能分析
二. 代码实现
1. 核心代码
三. 代码展示
四. 数据测试
五. 总结
一. 选择排序的实现
1. 简单选择排序
选择排序的基本思想是:每一趟(如第i趟)在后面n-i+1(i=1,2,3...n-1)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到第n-1趟做完,待排序元素只剩下1个,完成排序。
根据上面的思想可以很直观的得出简单选择排序算法的思想:假设排序表为L[1...n],第i趟排序即从L[i...n]中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可使得整个排序表有序。
2. 性能分析
空间效率:仅使用常数个辅助单元,故空间效率为O(1)。
时间效率:在简单选择排序过程中,元素的比较次数与序列的初始状态无关,始终是n(n-1)/2次,故时间复杂度是。
稳定性:在第i趟找到最小的元素后,和第i个元素交换,可能会导致第i个元素与其含有相同关键字元素的相对位置发生改变。因此,简单选择排序是一种不稳定的排序方法。
二. 代码实现
1. 核心代码
相当easy的代码,两轮循环,第一轮循环控制最小数字的位置i,第二轮循环找到最小数字的位置min,最后将i和min互换位置即可得到最终排序结果。
/**
*********************
* Selection sort. All data are valid.
*********************
*/
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;
} // Of if
} // Of for j
// Change the selected one with the current one.
data[tempIndexForSmallest] = data[i];
data[i] = tempNode;
} // Of for i
}// Of selectionSort
三. 代码展示
主类:
package Day_47;
import Day_41.DataArray;
public class demo1 {
/**
*********************
* The entrance of the program.
*
* @param args Not used now.
*********************
*/
public static void main(String args[]) {
// System.out.println("\r\n-------sequentialSearchTest-------");
int []paraKeyArray;
paraKeyArray=new int[]{11,2,3};
String[] paraContentArray = new String[]{"121","21","324"};
DataArray test=new DataArray(paraKeyArray,paraContentArray);
// test.insertionSort();
// System.out.println("Result\r\n" + test);
test.selectionSortTest();
}// Of main
}
调用类:
/**
*********************
* Selection sort. All data are valid.
*********************
*/
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;
} // Of if
} // Of for j
// Change the selected one with the current one.
data[tempIndexForSmallest] = data[i];
data[i] = tempNode;
} // Of for i
}// Of selectionSort
/**
*********************
* Test the method.
*********************
*/
public static void selectionSortTest() {
int[] tempUnsortedKeys = { 5, 3, 6, 10, 7, 1, 9 };
String[] tempContents = { "if", "then", "else", "switch", "case", "for", "while" };
DataArray tempDataArray = new DataArray(tempUnsortedKeys, tempContents);
System.out.println(tempDataArray);
tempDataArray.selectionSort();
System.out.println("Result\r\n" + tempDataArray);
}// Of selectionSortTest
四. 数据测试
运行结果
五. 总结
我个人感觉这个排序算法是最好理解的代码了(没有之一!),每一次从数字序列里面找到最小的数字,将它换到头部,一直进行n-1轮,故可以得到最终答案。