• 选择排序


    本人非科班出生,也未有人指导,纯属自学,难免有错误,恳请指导!

    ______________________________________________________________

    选择排序
    思想,每次从还未排序的子序列中选择最小(最大)的元素,排在已排序子序列中

    SELECTION_SORT(A)                                                           
        for i = 1 to A.length                                                                  
            min = A[i]                                                                             
            j = i + 1                                                                                
            whie j > 0                         
            if A[j]<min                                            
                min = A[j]                                                                         
                k = j                                                                                 
            j++                                                                                   
            A[j] = A[i]                                                                              
            A[i] = min                                                                             


    最好情况 T(n) = theta(n)
    最坏情况T(n) = theta(n^2)


    /*选择排序
     * @param array 输入数组
     * @param length 数组长度
     */
    void selection_sort(double array[], int length)
    {
        int i,j,k;
        for (i = 0; i < length; i++)
        {
            int min_value = array[i];
            j = i + 1;
            while (j < length)
            {
                if (array[j] < min_value)
                {
                    min_value = array[j];
                    k = j;
                }
                j++;
            }
            array[k] = array[i];
            array[i] = min_value;
        }
    }




    printf("选择排序测试 ");
        double arr_select[6] = {31, 41, 59, 26, 41, 58};
        printf("array=");
        for (int i = 0; i < 6; i ++)
        {
            printf("%lf ", arr_select[i]);
        }
        printf(" sorted array=");
        selection_sort(arr_select, 6);
        for (int i = 0; i < 6; i++)
        {
            printf("%lf ", arr_select[i]);
        }
        printf(" .......................................... ");


    今天又用到以前上面写的选择排序,发现有逻辑错误,就是数组前半部分需交换顺序,此时k等于某个值,而当数组后半部分不需交换顺序时,还在执行array[k] = array[i];

    array[i] = min_value;

    SELECTION_SORT(A)                                                           
        for i = 1 to A.length                                                                  
            min = A[i]                                                                             
            j = i + 1
    	k = i                                                                                
            whie j > 0                         
            if A[j]<min                                            
                min = A[j]                                                                         
                k = j                                                                                 
            j++  
    	if k != i                                                                                 
            	A[k] = A[i]                                                                              
            	A[i] = min             

    /*选择排序
     * @param array 输入数组
     * @param length 数组长度
     */
    void selection_sort(double array[], int length)
    {
        int i,j,k;
        for (i = 0; i < length; i++)
        {
            int min_value = array[i];
            j = i + 1;
    	      k = i;
            while (j < length)
            {
                if (array[j] < min_value)
                {
                    min_value = array[j];
                    k = j;
                }
                j++;
            }
    	if (k != i)
    	{
            	array[k] = array[i];
            	array[i] = min_value;
    	}
        }
    }



    参见《算法导论》
    ______________________________________________________

  • 相关阅读:
    拥有自己的代码生成器—Newlife.XCode模板编写教程
    基于Newlife.XCode的权限系统(含数据集权限)【设计篇】
    拥有自己的代码生成器—NewLife.XCode代码生成器分析
    利用javascript来转换GB2312到UNICONDE &#形式
    和荣笔记 从 Unicode 到 GB2312 转换表制作程式
    如何做SVN迁移
    和荣笔记 GB2312 字符集和编码说明
    asp对象化之:基于adodb.stream的文件操作类
    Unicode 汉字内码表
    微软建议的ASP性能优化28条守则 之三
  • 原文地址:https://www.cnblogs.com/corfox/p/5415019.html
Copyright © 2020-2023  润新知