修改后的双向选择排序函数

 1 void BiSelectSort( int a[ ], int n )    /* 双向选择排序函数 */
 2 {   int i, j, k, kmax, kmin, t;
 3     for( i=0, j=n-1; i<j; ++i, --j  )
 4     {   kmin=kmax=i;
 5         for( k=i+1; k<=j; ++k )        //一趟扫描找出最大值和最小值
 6         {   if( a[k]<a[kmin] )  kmin=k;
 7             if( a[k]>a[kmax] )  kmax=k;
 8         }
 9         //区分四种情况,分别进行处理,通常没有被人意识到而导致错误
10         if( kmin==j && kmax==i )    //1.
11         {    t=a[i];
12             a[i]=a[j];
13             a[j]=t;
14         }
15 //        else if( kmin==j && kmax!=i )    //2.省略这种情况,可在第四种情况下处理
16 //        {    t=a[i];
17 //            a[i]=a[kmin];
18 //            a[kmin]=a[i];
19 //            t=a[j];
20 //            a[j]=a[kmax];
21 //            a[kmax]=t;
22 //        }
23         else if( kmax==i && kmin!=j )    //3.
24         {    t=a[j];
25             a[j]=a[kmax];
26             a[kmax]=t;
27             t=a[i];
28             a[i]=a[kmin];
29             a[kmin]=t;
30         }
31         else                            //4.
32         {    if( kmin!=i )
33             {   t=a[i];
34                 a[i]=a[kmin];
35                 a[kmin]=t;
36             }
37             if( kmax!=j )
38             {   t=a[j];
39                 a[j]=a[kmax];
40                 a[kmax]=t;
41             }
42         }
43     }
44 }

时间: 2024-10-13 16:19:26

修改后的双向选择排序函数的相关文章

数据结构之——选择排序

选择排序的基本思想为:每一趟(例如第i趟)在后面的n-i+1(i=1,2,3,…...,n-1)个待排序元素中选取关键字最小的元素,作为有序序列的第i个元素,直到n-1趟做完,待排序元素只剩下一个,就不用选了,序列也排序完毕.选择排序主要有简单选择排序和堆排序,下面分别就这两种排序算法进行讨论. 1.简单选择排序 从上面选择排序的思想中可以很直观的得出简单选择排序的算法思想:假设排序列表为L[1……n],第i趟排序从L[i……n]中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的

一招教你搞定c语言中冒泡和选择排序

一.选择排序 很多学习C语言的同学都被这两种排序而难倒.每次拿到这样一组数字就不知道从何下手了,要不就是那些运用的不太熟悉,每次写起代码来又得花一大半时间让费在这排序上,总是找不到一种好的办法去学习它.那么接下来,我将我所学到的排序方法分享给大家,告诉你们以后遇到这种排序千万不能急.当然,很多企业面试的时候种排序也是必考的,所以我们务必要把他们搞懂,不能让这么小小的排序阻挡了我们前进的步伐.好了,那我们来看看吧! 我选择的方法是函数调用的方法,将排序的具体方式通过函数调用到main函数中执行,具

C#选择排序详解

选择排序图解                         选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总

夯实基础——选择排序

物理结构:数组 选择排序分析: 最优时间复杂度:O(n^2) 最坏时间复杂度:O(n^2) 平均时间复杂度:O(n^2) 最差空间复杂度:O(n) 稳定性:不稳定 选择排序函数: int SelectSort(int a[],int length); //选择排序 //每次选最小值放在最前面 int SelectSort(int a[],int length) { int i,j,min; for(i=0;i<length;i++) { min=i; for(j=i;j<length;j++)

java七大排序——3_选择排序

选择排序: 将待排元素分为有序区间和无序区间,无序区间在前,每次从无序区间的所有元素中选出一个最大的数array[max],将该数与无序区间最后一个数进行交换(相当于在有序区间的第一位置新插入一个数)假设开始全部元素都是无序区间内的:继续重复上述操作 最终结果代码实现 public static void selectSort(int[] array) {// //无序区间在前边 //每次选最大数 for (int i = 0; i < array.length - 1; i++) { int

第一部分:趣味算法入门;第八题:冒泡排序(并与选择排序对比)

100个不同类型的python语言趣味编程题 在求解的过程中培养编程兴趣,拓展编程思维,提高编程能力. 第一部分:趣味算法入门:第八题: 8.冒泡排序:对N个整数(数据由键盘输入)进行升序排序 冒泡排序的思想:首先从表头开始往后扫描数组,在扫描的过程中逐对比较相邻的俩个元素的大小.若相邻的两个元素中,前面的元素大于后面的元素,则将它们互换,称之为消去了一个逆序,在扫描的过程中不断的将两相邻元素中的大者往后移动,最后就将数组中的最大者换到了表的最后,然后在剩下的数组元素中(n-1)个元素重复上面的

解决Ext4.2.3中propertyGrid修改后点击排序报错

Ext4.2.3中PropertyGrid修改后点击排序报错,具体错误信息如下: 一开始还怀疑是自己哪里配置错了,各种尝试结果还是一样.查遍百度和谷歌,无果,只有一篇帖子说是4.2.4修正了.还是自己动手吧,自己动手丰衣足食. 点开报错地方(如下图所示),原来是me.field.column没有定义. 然后继续找,找啊找啊找到Ext.grid.property.Grid的getCellEditor方法.此方法有参数column,可在方法体内,column就没有被用到过,于是就感觉问题出在这里.

C语言之实现函数返回一个数组,以及选择排序,还有折半查找。这是同学的一个作业。。。

作业的具体要求如下: 编写一个完整的程序,实现如下功能.(1)    输入10个无序的整数.(2)    用选择排序法将以上接收的10个无序整数按从大到小的顺序排序.(3)    要求任意输入一个整数,用折半查找法从排好序的10个数中找出该数,若存在,在主函数中输出其所处的位置,否则,提示未找到.提示:可定义input函数完成10个整数的输入,sort函数完成输入数的排序,search函数完成输入数的査找功能. 下面是具体代码:(本人懒,没写注释,不过仔细看代码,还是很简单的) 1 #inclu

编写一个排序函数,实现数字排序。排序方法由客户函数实现,函数参数个数为两个,两个参数的关系作为排序后的元素间的关系。

<script>function SortNumber(obj,func) //定义通用排序函数{ //参数验证,如果第一个参数不是数组或第二个参数不是函数则抛出异常 if(!(obj instanceof Array) || !(func instanceof Function)) { var e = new Error(); //生成错误信息 e.number = 100000; //定义错误号 e.message = "参数无效"; //错误描述 throw e; /