【筆記】簡單選擇排序

Time-space發表於2017-11-05

  簡單選擇排序是一種簡單的選擇類排序演算法,它是通過依次找到待排序元素序列中最小的資料元素,並將其放在序列的最前面,從而使待排序元素序列變為有序序列。

  基本演算法思想:假設待排序的元素序列有n個, 在第一趟排序過程中,從n個元素序列中選擇最喜愛哦的元素,並將其放在元素序列的最前面即第一個位置。在第二趟排序過程中,從剩餘的n-1個元素中選擇最小的元素,將其放在第二個位置。依此類推,指導沒有待比較的元素,簡單選擇排序演算法結束。

  例如一組元素的關鍵字序列為(76,31,19,20,6,83,60,52),則簡單選擇排序的過程如圖所示。


這裡寫圖片描述

  簡單選擇是一種不穩定的排序演算法,在最好的情況下,待排序元素序列按照非遞減排列,則不需要移動元素;在最壞的情況下,待排序元素按照飛抵增排列,則在每一趟排序都需要移動元素,以哦的那個元素的次數為3(n-1)。在任何情況下,簡單選擇排序演算法都需要進行n(n-1)/2次的比較。綜上所述,簡單選擇排序演算法的時間複雜度是O(n2)

O(n^2)
。簡單選擇排序的空間複雜度是O(1)
O(1)

  • 型別定義
#define MaxSize 50
typedef int KeyType;
typedef struct /*資料元素型別定義*/
{
    KeyType key;/*關鍵字*/
}DataType;
typedef struct /*順序表型別定義*/
 {
    DataType data[MaxSize];
    int length;
}SqList;
  • 簡單選擇排序函式
void SelectSort(SqList *L,int n)
/*簡單選擇排序*/
{
    int i,j,k;
    DataType t;
    /*將第i個元素的關鍵字與後面[i+1...n]個元素的關鍵字比較,將關鍵字最小的的元素放在第i個位置*/
    for(i=1;i<=n-1;i++)
    {
        j=i;
        for(k=i+1;k<=n;k++) /*關鍵字最小的元素的序號為j*/
            if(L->data[k].key<L->data[j].key)
                j=k;
        if(j!=i)            /*如果序號i不等於j,則需要將序號i和序號j的元素交換*/
        {
            t=L->data[i];
            L->data[i]=L->data[j];
            L->data[j]=t;
        }
    }
}
  • 主程式
#include<stdio.h>
#include<stdlib.h>
void InitSeqList(SqList *L,DataType a[],int n)
/*順序表的初始化*/
{
    int i;
    for(i=1;i<=n;i++)
    {
        L->data[i]=a[i-1];
    }
    L->length=n;

}
void DispList(SqList L,int n)
/*輸出表中的元素*/
{
    int i;
    for(i=1;i<=n;i++)
        printf("%4d",L.data[i].key);
    printf("\n");
}
void main()
{
    DataType a[]={69,62,50,58,42,42,27,53};
    SqList L;
    int n=sizeof(a)/sizeof(a[0]);
    InitSeqList(&L,a,n);
    printf("[排序前]          ");
    DispList(L,n);
    SelectSort(&L,n);
    printf("[簡單選擇排序結果]");
    DispList(L,n);
}
  • 測試結果


這裡寫圖片描述

相關文章