数据结构与算法之简单排序算法

简单选择排序法就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换。

通俗得讲,每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。

#define N 5

int a[N] = {12,56,80,91,20};


void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

void SelectSort()
{
    for (int i = 0; i < N; i++)
    {
         min = i;   //设当前元素为最小值
         for (int j = i+1; j < N; j++)
         {    
             if (a[min] > a[j])  //如果后面有元素小于当前最小值
                min = j;            //将这个元素的下标赋值给min
         }
         if (i != min)   //如果最小值已经发生变化,则交换元素
            swap(&a[i], &a[min]);
    }
}

接着我们来看一个例子,假设我们需要排序的数组为{12,56,80,91,20}

当 i = 0时,则设 a[i] = 12 = a[min],即 min = i,然后依次与后面元素进行比较,第一次比较,12<56,则 min 还是0;接着进行第二次比较,12<80,则当前min = i = 0;以此类推...

完成i = 0,此时数组为 a[5] = {12,56,80,91,20}

当 i = 1时,则 a[1] = 56 = a[min],然后循环比较,至最后一个元素20时,56>20,,此时min = 4,且 i!= min,则交换56 与 20的位置,得到序列{12,20,80,91,56}

此后以此类推完成排序,最后排序完成的序列为{12,20,56,80,91}.

如上图,简单选择排序就是,依次遍历,设置当前下标i为最小值min,即(min = i)此后循环之后的数据,如果后面的数据中有小于当前最小值的数据,就将这个数据的下标赋值给min,循环完一次之后,判断此时 min 与 i是否相等,若不等于则说明找到最小值,则交换当前 i下标对应元素 与 min 对应元素的值。

简单选择排序复杂度分析

简单选择排序的特点是交换次数少,从而节约了排序的时间。对于比较次数,无论情况最好最坏,比较次数都是一样的,第i次排序,就需要n-i次比较,此时就需要比较

对于交换次数而言,最好的结果是交换次数为0,;最差的结果是需要交换n-1次。

总的时间复杂度就是O(n²),简单选择排序与冒泡排序时间复杂度都为 O(n²),但是简单选择排序性能更佳。

部分图片参考:http://c.biancheng.net/view/3446.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值