排序算法的一般选择规则,选择排序是最好的排序算法
基本思想在每次行程中从待排序的数据元素中选择最小(或最大)的元素,放在待排序序列的最前面,直到所有待排序的数据元素结束。
具体步骤1。读入的数据存储在数组A. 2中。从a[1]到A [n]中选择值最低的元素,与第一个位置的元素交换,然后将值最低的元素放入A [1]中。3.从a[2]到A [n]中选择值最低的元素,与第二个位置的元素交换,然后将值最低的元素放入A [2]中,4.直到第n-1个元素与第n个元素进行比较和排序。方法程序使用两层循环来完成算法,外循环I控制存储当前序列最小值的数组位置,内循环J控制从i 1到N序列中选取最小元素的位置K。
代码#包含iostream
使用命名空间std
int main()
{
int n,temp,array[1000];
CIN n;
array[0]=n;
for(int I=1;I=n;我)
{
cin阵列[I];
}
for(int I=1;I=n;我)
{
for(int j=I 1;j=n;j)
{
if(array[j] array[i])
{
temp=array[I];
array[I]=array[j];
array[j]=temp;
}
}
}
for(int k=1;k=n;k)
{
cout数组[k]“”;
}
返回0;
}测试#包含iostream
#包括cstdio
#包含cstdlib
#包括ctime
使用命名空间std
int main()
{
int n,temp,array[1000];
//CIN n;
//array[0]=n;
//for(int I=1;I=n;我)
//{
//cin数组[I];
//}
n=1000
srand(time(NULL));
for(int I=1;I=n;我)
array[i]=rand()000;
for(int I=1;I=n;我)
{
for(int j=I 1;j=n;j)
{
if(array[j] array[i])
{
temp=array[I];
array[I]=array[j];
array[j]=temp;
}
}
}
for(int k=1;k=n;k)
{
cout数组[k]“”;
}
cout endl
printf(所用时间=%.7lf ,(double)clock()/CLOCKS _ PER _ SEC);
返回0;
}
分析了算法的时间复杂度,排序的交换操作在0到(n-1)次之间。
选择的比较运算是(n-1)(n-2n-1)(n-2)……3 2 1 0=n(n-1)/2次。
所选的赋值操作在0到3 (n-1)次之间。
比较次数O(n ^ 2),与关键字的初始状态无关,
总比较次数N=(n-1) (n-2) … 1=n*(n-1)/2。
交换次数O(n),最好的情况是,已经被订购交换0次;最差交换是n-1次,逆序交换是n/2次。
交换次数比冒泡排序少得多。因为交换所需的CPU时间比比较所需的时间多,而且n的值较小,所以选择排序比冒泡排序快。
选择排序是为每个位置选择当前最小的元素,例如,第一个位置的最小元素,其余元素中第二个位置的第二小元素,以此类推,直到第n-1个元素,第n个元素不需要选择,因为只剩下它最大的元素了。
然后,在一个选择中,如果一个元素比当前元素小,而这个小元素出现在一个等于当前元素的元素后面,交换后稳定性就被破坏了。
比如序列5 8 5 2 9,我们知道第一个元素5会在第一时间和2交换,所以会破坏原序列中两个5的相对顺序,所以选择性排序是一种不稳定的排序算法。
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。