关于选择排序的思考

选择排序:遍历未排序的数列,找出最小元素,添加到已排序数列末尾。

以从小到大排序为例。

一、最初想法:

用两个List分别存放未排序和已排序的数列。

  1. 算法描述
    ①初始状态:未排序数列为要排序的数列,已排序数列为空;
    ②遍历未排序数列,找出最小的元素,从未排序数列中删除,添加到已排序数列;
    ③重复② n-1次。
  2. 代码(Java)
import java.util.Scanner;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class  Main{
    public static void main(String[] args) {
    	int count;
    	Scanner in = new Scanner(System.in);
    	count = in.nextInt();
    	List<Integer> arr = new ArrayList<Integer>();
    	for(int i = 0;i<count;i++)
    		arr.add(in.nextInt());
    	arr = SelectionSort (arr);
    }
    public static List<Integer> SelectionSort(List<Integer> arr) {
    	int temp, n = arr.size();
    	Map<Integer,Integer> map = new HashMap<Integer,Integer>();
    	List<Integer> sorted = new ArrayList<Integer>();
    	for(int i = 0;i < n-1 ;i++) {
    		temp = arr.get(0);
    		map.put(temp, 0);
    		for(int j = 1;j < arr.size();j++) {
    			if(temp > arr.get(j)) {
    				temp = arr.get(j);
    				map.put(temp, j);
    			}
    		}
    		sorted.add(temp);
    		int index=map.get(temp);
    		arr.remove(index);
    		for(int k = 0;k < sorted.size() ;k++)
	    		System.out.print(sorted.get(k)+" ");
    		for(int k = 0;k < arr.size();k++)
	    		System.out.print(arr.get(k)+" ");
    		System.out.print("\n");
    	}
    	return sorted;
    }
}
  1. 输入输出

输入:
9
25 84 21 47 15 27 68 35 20
输出:
15 25 84 21 47 27 68 35 20
15 20 25 84 21 47 27 68 35
15 20 21 25 84 47 27 68 35
15 20 21 25 84 47 27 68 35
15 20 21 25 27 84 47 68 35
15 20 21 25 27 35 84 47 68
15 20 21 25 27 35 47 84 68
15 20 21 25 27 35 47 68 84

  1. 编码过程中犯的错误

arr.remove~~(map.get(temp))~~ ;
错误原因:
map.get(temp)返回的是Integer类型的数据
arr.remove(int index)形参为int类型
所以删除失败

二、改进:

用一个数组存放要排序的数列即可,前 i 个为已排序,后 n-i 个为未排序。

  1. 算法描述:
    ①第1遍排序时,有序区为空,无序区为R(1…n),遍历无序区选择出最小元素,将该最小元素与无序区第一个元素交换,有序区为R(1),无序区为R(2…n);
    ②第 i 遍排序(i = 2,3…n-1)时,有序区为R(1…i-1),无序区为R(i…n),遍历无序区选择出最小元素,将该最小元素与无序区第一个元素交换,有序区为R(1…i),无序区为R(i+1…n);
    ③n-1遍排序结束,有序化完成。
  2. 代码(Java)
import java.util.Scanner;

public class  Main{
    public static void main(String[] args) {
    	int count;
    	Scanner in = new Scanner(System.in);
    	count = in.nextInt();
    	int[] arr = new int[count];
    	for(int i = 0;i < count;i++)
    		arr[i] = in.nextInt();
    	arr = SelectionSort (arr);
    }
    public static int[] SelectionSort(int[] arr) {
    	int temp,minIndex;
    	for(int i = 0;i < arr.length-1;i++){
    		minIndex = i;
    		for(int j = i+1; j < arr.length;j++) {
    			if(arr[minIndex] > arr[j]) {
    				minIndex = j;
    			}
    		}
    		temp = arr[i];
    		arr[i] = arr[minIndex];
    		arr[minIndex] = temp;
    		for(int k = 0 ;k < arr.length;k++)
    			System.out.print(arr[k]+" ");
    		System.out.println();
    	}
    	return arr;
    }
}
  1. 输入输出

输入:
9
25 84 21 47 15 27 68 35 20
输出:
15 84 21 47 25 27 68 35 20
15 20 21 47 25 27 68 35 84
15 20 21 47 25 27 68 35 84
15 20 21 25 47 27 68 35 84
15 20 21 25 27 47 68 35 84
15 20 21 25 27 35 68 47 84
15 20 21 25 27 35 47 68 84
15 20 21 25 27 35 47 68 84

你可能感兴趣的:(算法学习)