各种排序总结(二)直接选择排序

/***************
思路:外层循环:从0到n-1遍历数组。
      对于第i个元素,内层循环:从i+1开始遍历数组找到最小的元素,与i交换。
****************/

#include <iostream>

using namespace std;

void SelectSort(int* arr, int n)
{
    int i,j,temp,min_index;
    for(i=0; i <n-1; i++)
    {
        min_index = i;
        for(j=i+1; j<n; j++)
        {
            if(arr[j] < arr[min_index])
                min_index = j;
        }
        if(i != min_index)
        {
            temp = arr[i];
            arr[i] = arr[min_index];
            arr[min_index] = temp;
        }
    }
}
int main()
{
    int * arr;
    int n;
    cout<<"Input the arr length:"<<endl;
    cin>>n;
    arr = new int[n];
    cout<<"Input the arr elements:"<<endl;
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
    }
    SelectSort(arr,n);
    cout<<"The outcome:"<<endl;
    for(int i=0;i<n;i++)
        cout<<arr[i]<<endl;
    return 0;
}

/************************
不稳定
时间代价:最大、最小、平均时间代价均为O(n^2)。
空间代价:一个临时记录,O(1)。
总结:
1.由于时间为O(n^2),因此适用于数组n较小的情况。
2.由于整个排序过程最多n-1次交换,相比于同样时间复杂度的直接插入排序交换次数少,
  因此更适合于数据记录结构较大的情况。(由于移动大记录的时间开销大,选择排序
  可以最少的移动操作节省排序时间)
************************/
原文地址:https://www.cnblogs.com/CnZyy/p/3314635.html