标签:排序 选择 c++
1.算法描述
选择排序是一种蛮力法解决排序问题的算法。对其可简单描述为:对一个数列进行升序(降序)排列时,每次从剩余的序列中挑选出最小(最大)的数字,放到它的最终位置,以此类推,直到数列的所有数字都已经放到最终位置为止。可以简单的记忆为:选择最小(或最大),放到最终位置。
2.实例
使用选择排序法将下面数列按升序排序:
8 3 4 2 6 5
第一次在六个数字中找到最小的数字2,和数列的第一个数字交换位置,数列如下:
2 3 4 8 6 5
第二次在剩下的五个数字中找到最小的数字3,和数列的第二个数字交换位置,因为3本来的位置就是数列的第二个数字,数列顺序没有发生变化:
2 3 4 8 6 5
第三次在剩余的四个数字中找最小的数字4,和第二次情况一样,数列位置依然没有发生变化,如下:
2 3 4 8 6 5
第四次在剩余的三个数字中找最小的数字5,和数列的第四个数字交换位置,数列如下:
2 3 4 5 6 8
第五次在剩余的两个数字中找最小的数字6,和第二、三次情况一样,数列位置依然没有发生变化,如下:
2 3 4 5 6 8
第六次在剩余的一个数字中找最小的数字8,和第五次情况一样,数列如下:
2 3 4 5 6 8
最终排序后的数列也就出来了:
2 3 4 5 6 8
3.代码
void selection_sort::selection_sort_with_array(int nums[],int nums_count)
{
if(nums == nullptr || nums_count==0)
return;
int a = 0;
for(unsigned int i = 0; i< nums_count; i++)
{
a = i;
for(unsigned int j = i+1; j< nums_count; j++)
{
if(nums[a]>nums[j])
a = j;
}
if(a != i)
{
int temp = nums[a];
nums[a] = nums[i];
nums[i] = temp;
}
}
}
4.算法分析
在“3.代码“中我们可以看出,选择排序算法的基本操作就是比较和替换,那我们来计算一下它的时间复杂度:
从上面的内容中我们可以看出,比较的次数只和数组中数字的个数相关,假设一个长度为n的数组,分析如下:
选择第一个最小数,需要比较n-1次
选择第二个最小数,需要比较n-2次
选择第三个最小数,需要比较n-3次
............... ........ ......... ....
选择地n个最小数,需要比较0次
根据上面的分析,对一个长度为n的数组进行排序,比较次数为:
C(n)=(n-1)+(n-2)+(n-3)+....+0 = n*(n-1)/2;(等差公式:Sn=n*a1+n*(n-1)*d/2)
在最坏情况下,替换次数为:n-1
因此选择排序的时间复杂度为:O(n^2);
选择排序
标签:排序 选择 c++
原文地址:http://blog.csdn.net/angle502/article/details/42042893