选择排序(不稳定)
算法思想
每一趟均对数组未排序区间进行排序,将未排序区间的第一个元素和未排序区间的其他元素进行一一比较,找到未排序区间中最小的元素,与第一个元素进行交换。
时间复杂度
- 最好情况:O(n^2)
- 最坏情况:O(n^2)
- 平均复杂度:O(n^2)
实现思路
以arr[7] = {6,4,8,1,9,2,3}为例(默认升序):
先定义一个边界i区分已排序数组和未排序数组,[0,i)表示已排序数组,[i,size)表示未排序数组,定义一个min用于更新未排序数组每次比较较小值的下标,定义一个索引j用于探测未排序数组中的元素。
第一趟排序边界i的初始值为0,所以待排序区间为[0,size),待排序数组为arr = {6,4,8,1,9,2,3}
1.min = 0,j = i +1 = 1,arr[j] = 4 < arr[min] = 6,所以min = 1
2.j++ = 2,arr[j] = 8 !< arr[min] = 4,所以不做改变
3.j++ = 3,arr[j] = 1 < arr[min] = 4,所以min = 3
4.j++ = 4,arr[j] = 9 !< arr[min] = 1,所以不做改变
5.j++ = 5,arr[j] = 2 !< arr[min] = 1,所以不做改变
6.j++ = 6,arr[j] = 3 !< arr[min] = 1,所以不做改变
第一次循环结束,min != i,所以将arr[min]和arr[i]交换,此时数组变为arr = {1,4,8,6,9,2,3}
第二趟排序 i++ = 1,所以待排序区间为[1,size),待排序数组为arr = {4,8,6,9,2,3}
1.min = 1,j = i +1 = 2,arr[j] = 8 !< arr[min] = 4,所以不做改变
2.j++ = 3,arr[j] = 6 !< arr[min] = 4,所以不做改变
3.j++ = 4,arr[j] = 9< arr[min] = 4,所以不做改变
4.j++ = 5,arr[j] = 2 < arr[min] = 4,所以min = 5
5.j++ = 6,arr[j] = 3 !< arr[min] = 2,所以不做改变
第二次循环结束,min != i,所以将arr[min]和arr[i]交换,此时数组变为arr = {2,8,6,9,4,3}
第三趟排序 i++ = 2,所以待排序区间为[2,size),待排序数组为arr = {8,6,9,4,3}
1.min = 2,j = i +1 = 3,arr[j] = 6 < arr[min] = 8,所以min = 3
2.j++ = 4,arr[j] = 9 !< arr[min] = 6,所以不做改变
3.j++ = 5,arr[j] = 4< arr[min] = 6,所以min = 5
4.j++ = 6,arr[j] = 3 < arr[min] = 4,所以min = 6
第三次循环结束,min != i,所以将arr[min]和arr[i]交换,此时数组变为arr = {3,6,9,4,8}
第四趟排序 i++ = 3,所以待排序区间为[3,size),待排序数组为arr = {6,9,4,8}
1.min = 3,j = i +1 = 4,arr[j] = 9 !< arr[min] = 6,所以不做改变
2.j++ = 5,arr[j] = 4 < arr[min] = 6,所以min = 5
3.j++ = 6,arr[j] = 8 !< arr[min] = 6,所以不做改变
第四次循环结束,min != i,所以将arr[min]和arr[i]交换,此时数组变为arr = {4,9,6,8}
第五趟排序 i++ = 4,所以待排序区间为[4,size),待排序数组为arr = {9,6,8}
1.min = 4,j = i +1 = 5,arr[j] = 6 < arr[min] = 9,所以min = 5
2.j++ = 6,arr[j] = 8 !< arr[min] = 6,所以不做改变
第五次循环结束,min != i,所以将arr[min]和arr[i]交换,此时数组变为arr = {6,9,8}
第六趟排序 i++ = 5,所以待排序区间为[5,size),待排序数组为arr = {9,8}
1.min = 5,j = i +1 = 6,arr[j] = 8 < arr[min] = 9,所以min = 6
第六次循环结束,min != i,所以将arr[min]和arr[i]交换,此时数组变为arr = {8,9}
此时i++ = 6,j = i + 1 = 7 !< size = 7,循环结束,数组已经有序
代码实现
package Sort;
public class SelectSort {
public static void selectSort(int[] arr,int size){
if(size <= 1){
return;
}
for(int i = 0;i < size;i++){
int min = i;
for(int j = i + 1;j < size;j++){
if(arr[j] < arr[min]){
min = j;
}
}
if(min != i){
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
}
public static void main(String[] args) {
int[] arr = {6,4,8,1,9,2,3};
selectSort(arr,7);
for(int i:arr){
System.out.print(i + " ");
}
}
}
本文详细介绍了选择排序算法,包括其基本思想、时间复杂度分析、实现步骤及代码示例。通过实例解析,展示如何通过选择排序对数组进行升序排列。
2159

被折叠的 条评论
为什么被折叠?



