基本思想:
第一次从array[0]~~array[n-1](n = array.length)中选取最小值(升序,选取最小值,如果是降序,则选取最大值),与array[0]交换;第二次从array[1]~~array[n-1]中选取最小值,与array[1]交换,依次类推,直到选取array[n-2]~~array[n-1]中的最小值与array[n-2]交换,至此,排序完成,一共进行n-1次。
代码如下
/**
* 选择排序法(升序):时间复杂度 O(n²)
*
* @param array
*/
private static void selectSortAsc(int[] array) {
/*共循环N-1次,N为数组长度*/
for (int i = 0; i < array.length - 1; i++) {
/*中间值,用于存储数组中的最值,每次假定数组内未完成排序的第一个元素为最小值或者最大值*/
int tempValue = array[i];
int tempIndex = i;
/*依次对后面的元素与假定值进行比较*/
for (int j = i + 1; j < array.length; j++) {
/*升序:如果后续元素中还存在比假定值小的元素,将该元素保存在中间值中*/
/*降序:如果后续元素中还存在比假定值大的元素,将该元素保存在中间值中*/
if (array[j] < tempValue) {
tempValue = array[j];
tempIndex = j;
}
}
/*如果中间值索引未变化,说明当前值确为最值,否则交换未完成排序第一个元素和实际最小值*/
if (tempIndex != i) {
array[tempIndex] = array[i];
array[i] = tempValue;
}
}
}
排序规则
1、总共进行N-1轮排序(N为数组的长度);
2、每一轮排序又是一个循环:
- 2.1、先假定当前位置的元素为最值,保存最值和最值所处的index;
- 2.2、依次同序列后面的元素进行标胶,如果发现比当前数值更小或更大的值,就重新确定最值和最值所处的index;
- 2.3、当遍历完毕后,就得到本轮最值和最值所处的下标index;
- 2.5、如果整个过程中index为发生变化,说明当前最值无需交换数据,否则交换数值。