簡簡單單的選擇排序(2)

簡單選擇排序算法

簡單選擇排序(Simple Selection Sort)就是通過n-i次關鍵字間的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和第i(1<=i<=n)個記錄交換之。

運行示例:在這裏插入圖片描述

選擇排序

/* 對順序表L作簡單的選擇排序*/
#include <stdio.h>
#define MAXSIZE 10

typedef struct
{
    int r[MAXSIZE];
    int length;
}SqList;
void swap(SqList *L, int i, int j)
{
    int temp = L->r[i];
    L->r[i] = L->r[j];
    L->r[j] = temp;
}
void SelectSort(SqList *L)
{
    int i, j, min;
    for(i = 1; i < L->length; i++)
    {
        min = i;  //將當前下標定義爲最小值下標
        for(j = i+1; j <= L->length; j++)  //循環之後的數據
        {
            if(L->r[min] > L->r[j]) //如果有小於當前最小值的關鍵字
            {
                min = j;   //將此關鍵字的下標賦值給min
            }
        }
        if(i != min)  //若min不等於i,說明找到最小值,交換
        {
            swap(L, i, min); //交換r[i] 與 r[min]的值
        }
    }
}
int main()
{
    SqList H;
    int n;
    
    scanf("%d",&n);
    H.length = n;
    for(int i = 1; i <= n; i++)
    {
        scanf("%d",&H.r[i]);
    }
    SelectSort(&H);
     for(int i = 1; i <= n; i++)
    {
        printf("%d ",H.r[i]);
    }
}
/*
------------------
程序運行示例:
9 
9 1 5 8 3 7 4 6 2
1 2 3 4 5 6 7 8 9 %  
------------------
*/

最多經過八次交換,就可完成排序工作

簡單選擇排序複雜度分析

分析一下它的複雜度。它最大的特點就是交換移動數據次數相當少,這樣也就節約了相應的時間。無論最好還是最差的情況,其比較次數都是一樣的多,第i趟排序需要進行n-i次關鍵字的比較,此時需要比較i=2n(i1)\sum_{i=2}^n {(i-1)} = n(n1)2\frac{n(n-1)}{2}次。而對交換次數而言,當最好的情況下,也就是要排序的表本身就是有序的,交換爲0次,當最壞的情況,即待排序是逆序的情況,此時需要比較n-1次。基於最終的排序時間是比較與交換的次數總和,因此,總的時間複雜度依然爲O(n2n^2)。

儘管與冒泡排序同爲O(n2n^2),但簡單選擇排序的性能上還是要略優於冒泡排序。

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