选择排序

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

______________________________________________________________

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

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("选择排序测试\n");
    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("\nsorted array=");
    selection_sort(arr_select, 6);
    for (int i = 0; i < 6; i++)
    {
        printf("%lf ", arr_select[i]);
    }
    printf("\n..........................................\n");


今天又用到以前上面写的选择排序,发现有逻辑错误,就是数组前半部分需交换顺序,此时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;
	}
    }
}



参见《算法导论》
______________________________________________________

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值