选择排序

  选择排序的基本思想是:从选择表中最小的项并将其移至表的最前面开始。 然后选择表中的剩余项中的最小项,同时将其放到表的第二个位置。 通过重复从表的剩余部分选择最小的项,经过排序的部分便从前往后逐渐变长,而后面未排序的部分逐渐缩短。 最后,表中所有项都由大到小按次序排列了。 

  分析: 如果表有 n 项, 那么第一遍选择出最小项,放到表的最前, 然后第二遍,从剩余的项中选择出最小项,放到表的第二个位置,那么我们要筛选 n - 1 遍,让表的倒数第二个位置得到剩余项的最小值,那么自然而然,表就排好了。 那么每一遍的任务,就是从剩余项中选择出最小项。 由此写出伪代码。 

  伪代码: 

  P 取值为 1. (表示表的第一项)

  while (P <= n - 1)

    //要让第 P 项取得最小值。

    min 取值为  第P项的值;  

    N 取值为 P+1; 

    while (N <= n) 

      if (第 N 项的值 < min)

        index 变量记下 N 的值;

    N = N + 1;

    交换第 P 项和 第 index 项的值。

  P = P + 1;

public class SelectSort 
{
    public static void main(String[] args) 
    {
        int p = 0;
        int n, index;
        int[] a = {21, 8, 7, 88, 5, 20, 3, 22, 55, 99};
        int min;
        while (p < a.length - 1) 
        {
            //假设 a[p] 是最小项。
            min = a[p]; 
            index = p; 
            //使得 a[p] 是最小项。 
            n = p + 1; 
            while (n < a.length)  //n 的范围从 p+1 到 a.length - 1. 
            {
                if (a[n] < min)
                {
                    min = a[n];
                    index = n;    //将 n 保存下来
                }
                n = n + 1;    
            }
            //交换 a[index] 和 a[p] 的值, 这样就使得 a[p] 真正成为最小项。 
            int temp = a[index];
            a[index] = a[p];
            a[p] = temp; 
            //p 递增。 
            p = p + 1; 
        }
        //打印 数组。 
        for (int i = 0; i < a.length; i++)
        {
            System.out.print(a[i] + " ");
        }
    }
}

  我们用 for 循环代替 while 循环,显得更紧凑一点,然后把得到最小项的过程和交换数值的过程封装成方法进行调用, 得到下面的方法: 

public class SelectSort 
{
    public static void main(String[] args) 
    {
        
        int[] a = {1, 21, 8, 7, 88, 5, 20, 3, 22, 55, 99};
        //选择排序方法。 
        selectSort(a);
        
        //打印 数组。 
        for (int i = 0; i < a.length; i++)
        {
            System.out.print(a[i] + " ");
        }
    }
    
    public static void selectSort (int[] array) 
    {
        int p;
        int index = 0;
        for (p = 0; p < array.length - 1; p++) 
        {
            //得到数组中最小值的下标。 
            index = getSmallest(array, p);
            //交换 a[index] 和 a[p] 的值, 这样就使得 a[p] 真正成为最小项。 
            exchange(array, index, p);
        }
    }
    
    private static int getSmallest (int[] array, int position) 
    {
        //假设 a[p] 是最小项。
        int min = array[position]; 
        int index = position; 
        //使得 a[p] 成为真正的最小项。
        int n; 
        for (n = position + 1; n < array.length; n++)
        {
            if (array[n] < min)
            {
                min = array[n];
                index = n;    //将 最小值的下标 n 保存下来。 
            }
        }
        return index; 
    }
    
    private static void exchange (int[] array, int i, int j)
    {
        int temp = array[i]; 
        array[i] = array[j];
        array[j] = temp; 
    }
}

 

posted @ 2016-11-22 20:05  hunter_dave  阅读(204)  评论(0编辑  收藏  举报