选择排序

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

______________________________________________________________

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

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;
	}
    }
}



参见《算法导论》
______________________________________________________

原文地址:https://www.cnblogs.com/corfox/p/5415019.html