排序算法:选择排序

来源:互联网 发布:ipad air2实用软件 编辑:程序博客网 时间:2024/06/15 00:11

选择排序思路:
      每次从序列中选取最小的元素与序列前端的元素交换,依次类推,对于长度为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的,这大大的降低了程序运行过程中的开销。

0 0