排序原理:
1.每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较, 如果当前索引处的值大于其他某个索引处的值,则假定其他某个索引出的值为最小值,最后可以找到最小值所在的索引。
2.交换第一个索引处和最小值所在的索引处的值。
int a[] = {4,3,2,1}
- | a[0] | a[1] | a[2] | a[3] | 初始(假定)最小索引 | 比较后最小索引 |
原始数据 | 4 | 3 | 2 | 1 | 0 | - |
第一次 | 1 | 3 | 2 | 4 | 1 | 3 |
第二次 | 1 | 2 | 3 | 4 | 2 | 2 |
第三次 | 1 | 2 | 3 | 4 | 3 | 2 |
// 选择排序
public static int[] sort(int a[]){
for (int i = 0; i < a.length - 1 ; i++){
//记录最小索引位置
int minIndex = i;
for (int j = i + 1;j < a.length;j++){
if (a[minIndex] > a[j]){
minIndex = j;
}
}
// 交换第一个索引处和最小值所在的索引处的值
int temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
return a;
}
选择排序的时间复杂度分析:
交换次数和数据比较次数:
数据比较次数:
(N-1)+(N-2)+(N-3)+...+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;
数据交换次数:N-1
时间复杂度:N^2/2-N/2+
(
N-1
)
=N^2/2+N/2-1;
保留最高阶项,去除常数因子,时间复杂度为
O(N^2);