算法学习——选择排序

作为一名快毕业了的大四应届生,在找工作的时候体会到的最大的痛就是会算法的人永远比你有优势!!!

学学简单的算法,对自己还是有好处的。

选择排序,顾名思义就是要把元素选择出来进行排序,要选择,肯定就要有比较,这个时候我们的两层for循环就派上用场了。

假设我们要对一个数组a进行排序,我们要定义两个临时变量(替身),一个是为数组中顺序即将发生变化的元素做替身,一个是为了代替数组的下标,首先第一层for,我们要选出数组的第一个元素a[0],用一个临时变量temp代替a[0](temp = a[0]),用临时变量flag代替数组的下标,方便在第二层for中同数组中的其它元素作比较,假设我们要将数组升序排序,那么在第二层for中,如果出现比a[0]小的数,就使temp等于该数的值,同时记录下标的位置,第二层循环结束后,如果temp的值发生改变(下标的位置发生改变),那么我们就让a[0]等于temp,对应改变后的下标的位置处的值等于a[0],这就完成了第一趟排序,之后的第二趟、第三趟只要从a[1]、a[2]开始(由第一层for循环控制),以此类推,这样每次都会选出剩下的数中最小的数放在第i位上,所以叫做选择排序,当第一层for循环进行到数组的最后一个元素时,排序完成。

简单流程为:

int[] a = {54,21,69,23,45};

第一趟排序后元素的顺序为:[21],54,69,23,45

第二趟排序后元素的顺序为:[21],[23],69,54,45

第三趟排序后元素的顺序为:[21],[23],[45],54,69

第四趟排序后元素的顺序为:[21],[23],[45],[54],69

第五趟排序后元素的顺序为:[21],[23],[45],[54],[69]

因未执行到的循环中的数的大小是不可预知的,所以循环会一直执行到最后,选择排序的时间复杂度为O(n²)不变。

代码及测试结果如下:

package pp.suanfa;

/**
 * 选择排序
 * 
 * @author Administrator
 * 
 */

public class chooseSort{
    
    public static void cSort(int a[]){
        
        int temp = 0;
        int flag = 0;
        for(int i=0;i<a.length;i++)
        {
            temp = a[i];//取出a[i]的值
            flag = i;//取出i的值
            for(int j=i+1;j<a.length;j++)
            {
                if(temp>a[j])//将a[i]与a[i]后面的元素进行比较,若a[i]>a[j]则将a[j]的值取出
                {
                    temp = a[j];
                    flag = j;
                }
            }
            if(flag!=i)
            {
                a[flag] = a[i];//此时将a[i]与最终的a[j]值互换
                a[i] = temp;
            }
        }
    }
        public static void main(String[] args){
            int a[] = {35,21,46,15,53};
            cSort(a);
            for(int i=0;i<a.length;i++)
            {
                System.out.print(a[i]+" ");
            }
            System.out.println();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39209361/article/details/82824614