直接选择排序

来源:互联网 发布:mac ox驱动下载 编辑:程序博客网 时间:2024/04/28 11:34

直接选择排序算法也是很容易懂的一种算法,算法原理:依次将数组中的最小数放入数组中。

第一次:从a[0]~a[n-1]中选取最小值,与a[0]交换;

第二次:从a[1]~a[n-1]中选取最小值,与a[1]交换;

........


第n-1次:从a[n-2]~a[n-1]中选取最小值,与a[n-2]交换。

总共通过n-1次,所以最外层的循环为0--n-1;

核心算法实现如下:

<span style="font-size:18px;">void selectSort(int *a, int len){    if (a == NULL || len <= 1)    {        return;    }    int i, j;    for (i = 0; i < len - 1; i++)    {        int k = i;//保存最小的数的下标        for (j = i + 1; j < len; j++)        {            if (a[j] < a[k])            {                k = j;            }        }        if (k != i)//交换两个数        {            int tmp = a[i];            a[i] = a[k];            a[k] = tmp;        }    }}</span>

      直接选择排序时间复杂度虽然为O(n2),但是它确是一个不稳定的排序。(我记得在哪本书中看到说所有复杂度为O(n2)的排序算法是稳定排序)。比如说:1,5,5*,3,在第二次交换中,会把5和3交换,最后的结果为:1,3,5*,5;所以为一种不稳定的排序。它是属于一种选择排序,它也需要一个辅助的存储空间。下面是一个完整的可执行程序源代码。

#include "iostream"using namespace std;void printArray(int *a, int len)//数组的输出{    if (a == NULL)    {        cout << "数组为空,没有元素\n";        return;    }    int i;    for (i = 0; i < len; i++)    {        cout << a[i] << "  ";    }    cout << endl;}//直接选择排序  不稳定void selectSort(int *a, int len){    if (a == NULL || len <= 1)    {        return;    }    int i, j;    for (i = 0; i < len - 1; i++)    {        int k = i;        for (j = i + 1; j < len; j++)        {            if (a[j] < a[k])            {                k = j;            }        }        if (k != i)        {            int tmp = a[i];            a[i] = a[k];            a[k] = tmp;        }    }}void main(){    int a[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };    int len = sizeof(a) / sizeof(a[0]);    printArray(a,len);    selectSort(a, len);    printArray(a, len);    system("pause");}

共同学习,一起进步!如有不足之处,请指出,谢谢!


0 0
原创粉丝点击