基本思想:
选择排序的原理是每次一从待排序的数据元素中找到最大(或者最小)的元素放到序列的起始位置,直到全部的待排序的数据元素排完。
实现代码
public class test {
public static void main(String[] args){
Integer[] arr = {10,9,3,1,4,2,7,8,6,5};
test.sort(arr);
for(int a:arr){
System.out.println(a);
}
}
private static void sort(Integer[] arr) {
int n = arr.length;
for(int i=0;i<n;i++){
int minIndex = i;
for(int j=i+1;j<n;j++){
//注意循环的时候是和最小的元素进行比较
if(arr[j]<arr[minIndex]){
minIndex = j;
}
}
swap(arr,i,minIndex);
}
}
private static void swap(Integer[] arr, int i, int minIndex) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
核心代码讲解
for(int i=0;i<n;i++){
int minIndex = i;
for(int j=i+1;j<n;j++){
if(arr[j]<arr[minIndex]){
minIndex = j;
}
}
swap(arr,i,minIndex);
}
代码中用minIndex变量指向每一次排序数据元素中最小的元素的位置。
第一趟循环时:i=0,j=1,查找arr[0,n)中最小元素,记录该最小元素的下标minIndex,最后交换下标为i,minIndex的元素
第二趟循环:i=1,j=2。内层循环为:for(int j=j+1;j<n;j++)
即:这时比较数组时从第三个元素和第二个元素开始进行计较。因为一个元素在一趟循环时已经是确定是最小的了。这次循环找到arr[1,n)中最小的数据元素,然后放到i=1的位置
时间复杂度
通过两层的for循环 可以知道选择排序的时间复杂度为O(n^2)
以上内容有表述不当或有误的地方,欢迎指出!