思路:
首先将数组分为两个部分,一个有序的部分,一个无序的部分,然后每次从无序的部分中选择最小的元素,放到有序的部分中去。
代码如下:
private static void select(int[] nums){
int n = nums.length;
for(int i = 0;i<n-1;i++){
int s = i; //最小元素的索引
for(int j = i+1;j<n;j++){
if(nums[s]>nums[j]){
s= j; //交换最小索引
}
}
if(s!=i){ //只有当最小索引改变的时候,才会去交换
swap(nums,s,i);
}
}
}
private static void swap(int[] nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
分析:
(1)时间复杂度:外层循环需要处理无序部分,内层循环则在无序部分中查找最小的元素,所以需要的时间复杂度是O(n^2)。
(2)空间复杂度:不需要使用额外的空间,所有的操作都是在原来的数组上修改,所以空间复杂度为O(1)。