选择排序思路:
每次从序列中选取最小的元素与序列前端的元素交换,依次类推,对于长度为n的序列,进行n-1趟排序后序列将变为有序。
由于每趟排序过程中,都是比较完成后才进行交换,所以选择排序的交换次数为n-1次,如果考虑到最小元素可能就是当前元素无需交换,则选择排序的交换次数<=n-1。
以长度为6的序列 {6,3,5,4,1,2} 的选择排序过程做示范:
第一趟排序:[1] 3 5 4 6 2 (最小元素1与6交换)
第二趟排序:[1 2] 5 4 6 3 (最小元素2与3交换)
第三趟排序:[1 2 3] 4 6 5 (最小元素3与5交换)
第四趟排序:[1 2 3 4] 6 5 (4为最小元素无需交换)
第五趟排序:[1 2 3 4 5] 6 (最小元素5与6交换)
本文根据上述的选择排序思路给出C++与Java的代码实现,并且使用Java对选择排序算法和排序算法:冒泡排序中的两种冒泡算法进行性能比较。
C++代码实现:
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void SelectSort(int *arr, int length)
{
if (arr == NULL || length <= 0)return;
int index;
int min;
for (int i = 0; i < length-1; ++i)
{
min = arr[i]
index = i;
for (int j = i + 1; j < length; ++j)
{
if (arr[j] < min)
{
index = j;
min = arr[j];
}
}
if (index != i)swap(&arr[i], &arr[index]);
}
Java代码:
private void selectSort(List<Integer> list) {
int length = list.size();
for (int i = 0; i < length - 1; ++i) {
int min = list.get(i);
int indexOfMin = i;
for (int j = i + 1; j <= length - 1; ++j) {
int currentNum = list.get(j);
if (currentNum < min) {
min = currentNum;
indexOfMin = j;
}
}
if (indexOfMin != i) {
swap(list, i, indexOfMin);
}
}
}
使用完全相同的元素为整数的List对选择排序算法以及两种冒泡排序算法进行性能测试结果如下:
序列元素个数为1000时:
序列元素个数为5000时:
序列元素个数为10000时:
序列元素个数为50000时:
可以发现,选择排序的效率表现是远远高于冒泡法的,其中一个很重要的原因就是选择排序法的交换次数一定是小于等于N的,这大大的降低了程序运行过程中的开销。