思想: 选择排序是将当前元素和之后数组中最小的元素进行比较

    • 如果当前元素大于后面数组中最小的元素,那么执行交换操作
    • 如果当前元素小于等于后面数组中最小的元素,则不执行交换操作,继续往后比较
      选择排序 - 图1

    时间复杂度选择排序 - 图2#card=math&code=O%28N%5E2%29)

    空间复杂度选择排序 - 图3#card=math&code=O%281%29)

    稳定性:不稳定,例如5 8 5 2 9,第一轮选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了


    Java代码实现:

    1. public int[] selectSort(int[] arr){
    2. if(arr.length < 2){
    3. return arr;
    4. }
    5. for (int i = 0; i < arr.length; i++) {
    6. // 将当前元素认为是最小的元素
    7. int index = i;
    8. System.out.print(arr[i] + " " );
    9. for(int j = i; j < arr.length; j++){
    10. // 如果后续有更小的元素,则更新index
    11. if(arr[j] < arr[index]){
    12. index = j;
    13. }
    14. }
    15. // 将当前遍历位置的元素和后续数组中最小的元素互换
    16. swap(arr, index, i);
    17. System.out.println(Arrays.toString(arr));
    18. }
    19. return arr;
    20. }
    21. public void swap(int[] arr, int i, int j) {
    22. int temp = arr[i];
    23. arr[i] = arr[j];
    24. arr[j] = temp;
    25. }

    Python代码实现:

    1. # 选择排序
    2. # 每一轮都将当前最小的元素放在已排序区间的后面
    3. def select_sort(nums):
    4. n = len(nums)
    5. for i in range(0,n - 1):
    6. min = i #最小元素下标标记
    7. for j in range(i + 1,n):
    8. if nums[j] < nums[min] :
    9. min = j #找到最小值的下标
    10. nums[min],nums[i] = nums[i],nums[min] #交换两者
    11. print('index: {} -- {}'.format(i, nums))
    12. return nums
    13. if __name__ == "__main__":
    14. nums = [5, 2, 9, 7, 6, 12, 3, 4]
    15. # 选择排序
    16. print ('select sort result is: ', select_sort(nums))