简单选择排序的思想:
通过
n−i
n
−
i
次关键字间的比较,从
n−i+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<iostream>
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保留较小值的记录,到最后全部遍历完在交换,会比每次发现就交换节省时间成本。
时间复杂度分析:
第一次循环需要
n−1
n
−
1
,第二次循环需要
n−2
n
−
2
,第三次需要
n−3
n
−
3
,以此类推,总的时间复杂度为:
n−1+n−2+...+2+1=n(n−1)/2
n
−
1
+
n
−
2
+
.
.
.
+
2
+
1
=
n
(
n
−
1
)
/
2
.