C++实现简单选择排序

简单选择排序的思想:
通过 ni n − i 次关键字间的比较,从 ni+1 n − i + 1 个记录中选出关键字最小的记录,并和第 i(1<=i<=n) i ( 1 <= i <= n ) 个记录交换之。这句话比较晦涩,我们可以通过一个例子来说明。
举例说明:
对于序列为{9,3,1,5}的序列:
第一步,记录为0的关键字为9,与记录为0之后的所有记录的关键字相比较,找到关键字最小的记录,对于上述序列,记录为2的关键字最小为1,所以经过第一步序列变成{1,3,9,5};
第二步,记录为1的关键字为3,与记录为1之后的所有记录的关键字相比较,由于记录为1的关键字3最小,所以不需要交换,经过这一步序列没有变化{1,3,9,5};
以此类推,第三部序列变成{1,3,5,9},结束(只需要到n-1即可)。
代码实现:

#include
using namespace std;

void ShowArr(int arr[], int length);
void SelectSort(int arr[], int length);
void Swap(int arr[], int i, int j);

int main()
{
    int arr[] = { 9,2,3,3,9,7,5,1,9,2,10 };
    int length = sizeof(arr) / sizeof(int);
    ShowArr(arr, length);
    SelectSort(arr, length);
    ShowArr(arr, length);

    system("pause");
    return 0;
}

void ShowArr(int arr[], int length)
{
    for (int i = 0; i < length; i++)
        cout << arr[i] << "\t";
    cout << endl;
}

void SelectSort(int arr[], int length)
{
    if (arr == nullptr || length <= 0)
        return;
    for (int i = 0; i < length - 1; i++)
    {
        int min = i;
        for (int j = i+1; j < length; j++)
        {
            if (arr[min] > arr[j])
                min = j;
        }
        if (i != min)
            Swap(arr, i, min);
    }
}

void Swap(int arr[], int i, int j)
{
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

程序实现细节:
对于每次循环,当发现前面的关键字比后面的关键字大时,没有直接进行交换,而是通过min保留较小值的记录,到最后全部遍历完在交换,会比每次发现就交换节省时间成本。
时间复杂度分析:
第一次循环需要 n1 n − 1 ,第二次循环需要 n2 n − 2 ,第三次需要 n3 n − 3 ,以此类推,总的时间复杂度为: n1+n2+...+2+1=n(n1)/2 n − 1 + n − 2 + . . . + 2 + 1 = n ( n − 1 ) / 2 .

你可能感兴趣的:(C++)