算法回顧之簡單選擇排序
概述
選擇排序分爲簡單選擇排序和堆排序,可以說,簡單選擇排序是最簡單的排序算法之一,它十分直觀,易懂,但同時,它也是能力十分強大 的堆排序的基礎。
思路
簡單選擇排序的思路十分簡單,大致如下:
每次從未排序序列中找到權值最大(最小)的項,把它放到未排序序列的最前面,或者說已排序序列的最後面,即和未排序的第一個元素互換。重複執行,知道整個序列有序。
以從小到大排序爲例,考慮下面這個序列:
2 8 7 9 3 6 1
一共七個數
第一趟: 找到最小的數1
,把它和無序序列的首個互換,構成序列 1 | 8 7 9 3 6 2
(|
分割已排序和未排序序列,後面相同)
第二趟: 最小的數2,和8互換,此時序列爲 1 2 | 7 9 3 6 8
第三趟: 找到最小的數3,和7互換,變成 1 2 3 | 9 7 6 8
第四趟: 找到最小的數6,和9互換,變成 1 2 3 6 | 7 9 8
第五趟: 找到最小的數7,無需變動,變成 1 2 3 6 7 | 9 8
第六趟:找到最小的數8,和9互換,變成 1 2 3 6 7 8 | 9
此時已經有序
實現
選擇排序比較簡單,直接上代碼
#include<iostream>
#define MAXN 100
using namespace std;
void Selectsort(int a[],int n)
{
int i,j;
for(i=1;i<n;i++)
{
int minn=i;
for(j=i+1;j<=n;j++)
//找到無序序列中的最小值
if(a[j]<a[minn]) minn=j;
//如果最小值和無序序列的第一個元素不等,則互換
if(minn!=i) {a[0]=a[i];a[i]=a[minn];a[minn]=a[0];}
}
}
int main()
{
int n,a[MAXN];
int i;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
Selectsort(a,n);
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
複雜度分析
空間複雜度
數組首位放空,作爲保存最小值的中介。
空間複雜度爲
時間複雜度
最好情況和最壞情況均要比較
最好情況,移動次數爲
最壞情況,移動
時間複雜度爲
Tip:還有另一種選擇排序,堆排序