對簡單排序的二次改進

簡單選擇排序的思想是每次從中選出最小(或者最大)的一個元素,然後把該元素與當前list的最前面的元素交換,直至剩下最後一個元素時,排序完畢

對簡單選擇排序的改進,主要是在選擇時,可以同時將當前list中的最大list[max]和最小元素list[min]都找出來,然後將最小元素與當前list中的首元素交換,然後再將最大的元素與當前list中的最後一個元素交換,直至最後一組元素交換完畢,整個排序結束。這樣的話僅需要原來的一半。

舉個栗子,對於一個無序 的list={49,38,65,97,76,13,27,49,55,4},

1、找到當前最大的97和當前最小的4,將4交換到首位,將97交換到末位


2、找到從38到55區間段的最大值76和最小值13,將13交換到38的位置,將76交換到55的位置


3、找到從65到最後一個49區間段的最大值65和最小值27,將65交換到49的位置,將27交換到65的位置,注意,這時候的交換順序爲:

首先交換27到65處:4 13 27 55 38 65 49 76 97,這時候最大的65已經被交換走了,所以不能直接用記錄的最大值的位置list[2]去交換,因爲65是與最小值27交換的,所以65的真實位置是找到的list[min],所以只需要list[min]與當前的最後一個元素49交換即可。


4、找到從49(前)到49(後)的最大值55和最小值38,將38與49(前)交換,將55和49(前)交換


5、最後發現從49到49只剩下兩個元素,並且相等,故不需要交換,最後的排序結果即爲:


注意:

實現思路:1、找到當前list的最大元素list[max]和最小元素list[min]

  2、將最大元素list[max]和最小元素list[min]插入到當前的首位和末位

插入技巧

如果最小元素list[min]不等於當前list的首位:

{

將最小元素與首位元素交換

如果當前list首元素與最大元素相等(最小元素在交換時已經將最大元素從首位換掉了):

{

再將list[min]與當前list的末位元素交換即可完成最大元素的位置交換

}

否則:

直接交換最大元素list[max]與當前list的末位元素

}

否則:

直接交換最大元素list[max]與當前list的末位元素


交換技巧

如果兩個元素不相等,則進行交換,如果相等,則不做任何處理


其代碼實現如下:

#include <stdio.h>
#include <stdlib.h>

void swap(int *a,int *b)
{
    int t;
    if(*a != *b)
    {
        printf("交換元素%d和%d\n",*a,*b);
        t = *a;
        *a = *b;
        *b = t;
    }
}

void getNum(int array[],int len,int start,int end)
{
    int i,j;
    int max = array[start];
    int pMax = start;
    int min = array[start];
    int pMin = start;
    int t;
    for(i=start;i<=end;i++)
    {
        if(max < array[i])
        {
            max = array[i];
            pMax = i;
        }
         if(min > array[i])
        {
            min = array[i];
            pMin = i;
        }
    }
    printf("--------------------------------第%d次----------------------\n",(start+1));
    printf("最小的元素array[%d] = %d\n",pMin,array[pMin]);
    printf("最大的元素array[%d] = %d\n",pMax,array[pMax]);

   /* printf("當前首元素array[%d] = %d\n",start,array[start]);
    printf("當前末尾元素array[%d] = %d\n",end,array[end]);
*/
    if(array[start] != array[pMin])
    {
        swap(&array[start],&array[pMin]);
        if(array[start] == array[pMax])
        {
            swap(&array[end],&array[pMin]);
        }else{
            swap(&array[end],&array[pMax]);
        }
    }else{
        swap(&array[pMax],&array[end]);
    }
}

void showList(int array[],int len)
{
    int i;
    for(i=0;i<len;i++)
        printf("%d   ",array[i]);
    printf("\n");
}

void sortList(int list[],int len)
{
     int i,j;
    for(i=0,j=len-1;i<len/2;i++,j--)
    {
        getNum(list,len,i,j);
        showList(list,len);
    }
}

int main()
{
    int list[10] = {49,38,65,97,76,13,27,49,55,4};
    showList(list,10);
    int len=10;

    sortList(list,len);

    showList(list,len);
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章