问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

选择排序法的算法

发布网友 发布时间:2022-04-22 05:04

我来回答

1个回答

热心网友 时间:2022-05-14 17:59

简单选择排序算法分析:在简单选择排序过程中,所需移动记录的次数比较少。最好情况下,即待排序记录初始状态就已经是正序排列了,则不需要移动记录。最坏情况下,需要移动记录的次数最多为3(n-1)(此情况中待排序记录并非完全逆序,给完全逆序记录排序的移动次数应为(n/2)*3,其中n/2向下取整)。简单选择排序过程中需要进行的比较次数与初始状态下待排序的记录序列的排列情况无关。当i=1时,需进行n-1次比较;当i=2时,需进行n-2次比较;依次类推,共需要进行的比较次数是∑ =(n-1)+(n-2)+…+2+1=n(n-1)/2,即进行比较操作的时间复杂度为O(n2)。
选择排序法 是对 定位比较交换法(也就是冒泡排序法) 的一种改进。在讲选择排序法之前我们先来了解一下定位比较交换法。为了便于理解,设有10个数分别存在数组元素a[0]~a[9]中。定位比较交换法是由大到小依次定位a[0]~a[9]中恰当的值(和武林大会中的比武差不多),a[9]中放的自然是最小的数。如定位a[0],先假定a[0]中当前值是最大数,a[0]与后面的元素一一比较,如果a[4]更大,则将a[0]、a[4]交换,a[0]已更新再与后面的a[5]~a[9]比较,如果a[8]还要大,则将a[0]、a[8]交换,a[0]又是新数,再与a[9]比较。一轮比完以后,a[0]就是最大的数了,本次比武的武状元诞生了,接下来从a[1]开始,因为状元要休息了,再来一轮a[1]就是次大的数,也就是榜眼,然后从a[2]开始,比出探花,真成比武大会了,当比到a[8]以后,排序就完成了。
下面给大家一个例子:
int main(void)
{
int a[10];
int i,j,t;
for ( i = 0; i < 10; i ++ ) scanf("%d",&a[ i ]); /*输入10个数,比武报名,报名费用10000¥ ^_^*/
for ( i = 0; i < 9; i ++ )
for ( j = i + 1; j < 10; j ++)
if ( a[ i ] < a[ j ] ) { t = a[ i ]; a[ i ] = a[ j ]; a[ j ] = t; } /*打不过就要让出头把交椅,不过a[ i ]比较爱面子,不好意思见 a[ j ],让t帮忙*/
for( i = 0; i < 10; i ++) printf("%4d",a[ i ]); /*显示排序后的结果*/
return 0;
}
好啦,啰嗦了半天总算把定位比较排序法讲完了,这个方法不错,容易理解,就是有点麻烦,一把椅子换来换去,哎~
所以就有了下面的选择排序法,开始的时候椅子谁也不给,放在一边让大家看着,找个人k记录比赛结果,然后发椅子。具体来讲呢就是,改进定位比较排序法,但是这个改进只是一部分,比较的次数没变,该怎么打还是怎么打,就是不用换椅子了。每次外循环先将定位元素的小标i值记录到K,认为a[k]是最大元素其实k=i还是a[ i ]最大,a[k]与后面的元素一一比较,该交换的也交换,就是把K的值改变一下就完了,最后在把a[k]与a[ i ]交换,这样a就是最大的元素了。然后进入下一轮的比较。选择排序法与定位比较排序法相比较,比的次数没变,交换的次数减少了。
下面也写个例子:
由大到小时:
int main(void)
{
int a[10];
int i,j,t,k;
for ( i = 0; i < 10; i ++ ) scanf("%d",&a[ i ]); /*输入10个数,比武报名,报名费用10000¥ ^_^*/
for ( i = 0;i < 9;i ++ ) /*10个数,所以只需比9次*/
{
k = i; /*裁判AND记者实时追踪报道比赛情况*/
for ( j = i + 1; j < 10; j ++)
if ( a[ k ] < a[ j ] ) k = j; /*使a[k]始终表示已比较的数中的最大数*/
if (k!=i)
{ t = a[ i ]; a[ i ] = a[ k ]; a[ k ] = t;} /* t 发放奖品* /
}
for( i = 0; i < 10; i ++) printf("%4d",a[ i ]); /*显示排序后的结果*/
return 0;
}
由小到大时:
int main(void)
{
int a[10];
int i,j,t,k;
for ( i = 0; i < 10; i ++ ) scanf("%d",&a[ i ]); /*输入10个数,比武报名,报名费用10000¥ ^_^*/
for ( i = 0; i < 9; i ++ )
{
k = i; /*裁判AND记者实时追踪报道比赛情况*/
for ( j = i + 1; j < 10; j ++)
if ( a[ k ] > a[ j ] ) k = j;
if (k!=i)
{ t = a[ i ]; a[ i ] = a[ k ]; a[ k ] = t; }/* t 发放奖品*/
}
for( i = 9; i >= 0; i --) printf("%4d",a[ i ]); /*显示排序后的结果*/
return 0;
}
java选择排序法代码 public static void main(String[] args) {
Random random=new Random();
int[] pData=new int[10];
for(int i=0;i<pData.length;i++){ //随机生成10个排序数
Integer a =random.nextInt(100);
pData[i]= a;
System.out.print(pData[i]+" ");
}
System.out.println();
pData=Choose(pData);
for(int i=0;i<pData.length;i++){
System.out.print(pData[i]+" ");
}
System.out.println();
}
public static int[] Choose(int[] pData){
System.out.println();
for (int i = 0; i < pData.length; i++) {
for (int j = i; j < pData.length; j++) {
if(pData[j]<pData[i]){
int a=pData[j];
pData[j]=pData[i];
pData[i]=a;
}
}
}
return pData;
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
吃生大蒜好吗 吃生大蒜有什么好处呢 保字词语接龙两个字 建筑设计资质有哪些 iphone视频格式 男人说纠结是什么意思纠结是什么意思 古天乐的资料!!! 胆结石可以喝柠檬蜂蜜水吗 柠檬对结石有什么作用 胆结石可以吃柠檬吗 江西有哪些风景 红磷在氧气中和空气中燃烧的现象为何不同? 选择排序法 磷的颜色和状态,在空气中的燃烧状态,在氧气中的燃... C语言中的选择排序法是什么? 磷在空气中燃烧&nbsp;氧气中燃烧&nbsp;火焰&nbsp;... 磷粉是在什么样的环境下产生的呢?燃烧的时候是和空... 磷和磷的化合物在空气中极易燃烧,氧化成() 白磷在空气中和氧气中的变化 别人的卡号叫我转钱过去,如何才能把它冻结? 初中化学磷在空气氧气中燃烧 我转出去的钱!对方没收冻结了账号能退回来了吗? 转账出去的钱能冻结对方吗 如果别人转账成功了能不能把钱冻结 想报个专升本冲刺辅导班,我是山东济南的,了解了... 余额宝转出钱为什么是冻结了 智博教育学校离济南东青银出口多远 给对方转账但是转过去的钱被冻结,那我的钱还能回... 济南市的那个智博什么学校是干什么的?我有个朋友... 济南智博教育到汽车东站坐那几路公交车 济南 高联詺诚 和 智博教育 医学专升本哪个好,教... 为什么红磷燃烧实验可以测量空气中氧气的含量 选择排序法的基本思想 磷在空气中燃烧 与磷在氧气中燃烧的区别(现象) 磷在空气中燃烧和铁丝在氧气中燃烧的化学方程式 C语言中选择排序法具体是怎样的? 红磷在空气中燃烧为什么说明了氧气占五分之一 选择排序法和冒泡法 有何区别 选择排序算法的思想是什么? 电压力锅煮粽子要多久 粽子可以用高压锅煮吗 粽子用高压锅要煮多长时间 6 在计算机二级c语言中 什么是选择排序法? c语言数组排序中的选择法是什么意思啊? 电压力锅煮粽子需要多长时间? 在c语言中选择排序法 写出选择排序法的过程 粽子用电压力锅煮多久能熟 用“选择排序法”对一维数组中的整数进行排序 将选择排序法编写成函数,实现10个任意整数按从小到... 选择法排序 快手粉丝团怎么退出从新到0粒