算法学习之选择排序算法(java)

来源:互联网 发布:db2 查看数据库 名称 编辑:程序博客网 时间:2024/05/16 13:05

记录今天学习的选择排序算法

个人理解的选择排序 :从未排序的的序列中选择最小或者最大元素,放到已排序的序列的最后一位,完成排序。

根据对选择排序的理解,首先在未排序的序列中找到最小或者最大元素的位置,实例为寻找最小元素:

public static int getSmallerPos(int src[],int pos){if(src==null||src.length==0){return -1;}int smaller=src[pos];int smallerPos=pos;for(int i=pos+1;i<src.length;i++){if(smaller>src[i]){smaller=src[i];smallerPos=i;}}return smallerPos;}
然后根据进行换位排序:

public static void selectSort1(int src[]){if(src==null||src.length<2){return;}int pos=0;int srcLen=src.length;for(int i=0;i<srcLen-1;i++){pos=getSmallerPos(src,i);if(pos!=i){int temp=src[i];src[i]=src[pos];src[pos]=temp;}}}
测试排序时间:

public class SortTest{final static int[] bigArray=new int[100000];static{for(int i=0;i<bigArray.length;i++){bigArray[i]=(int)(Math.random()*1000000);}}public static void main(String[] args) {int[] array=bigArray;System.out.println("开始排序...");long startTime=System.currentTimeMillis();selectSort1(array);//选择排序算法实现//insertSort4(array);//直接插入排序算法实现long endTime=System.currentTimeMillis();System.out.println("排序时间是"+(endTime-startTime)+"毫秒");int len=array.length<20?array.length:20;for(int i=0;i<len;i++){System.out.print(array[i]+(i==len-1?"":","));}System.out.print(",……,");System.out.print(array[array.length-3]+",");System.out.print(array[array.length-2]+",");System.out.print(array[array.length-1]);}}
执行结果:

开始排序...排序时间是4411毫秒9,13,22,49,60,82,86,93,96,103,108,114,126,129,131,140,151,168,170,174,……,999993,999998,999998

另一台电脑(我的小破电脑)执行结果:

开始排序...排序时间是6950毫秒2,2,15,32,39,52,56,59,64,70,80,82,87,105,131,137,145,145,156,164,……,999967,999978,999990

以上代码合并成一个嵌套的for循环:

public static void selectSort2(int src[]){if(src==null||src.length<2){return;}int pos=0;int srcLen=src.length;for(int i=0;i<srcLen-1;i++){pos=i;int smaller=src[i];for(int j=i+1;j<srcLen;j++){if(smaller>src[j]){smaller=src[j];pos=j;}}if(pos!=i){int temp=src[i];src[i]=src[pos];src[pos]=temp;}}}

同样使用上面的SortTest类测试执行时间

执行结果:

开始排序...
排序时间是7345毫秒
6,7,10,13,13,13,19,19,30,38,74,76,101,134,136,144,148,150,150,163,……,999984,999986,999989

另一台电脑(我的小破电脑)执行结果:

开始排序...
排序时间是12819毫秒
3,17,21,47,61,62,71,81,84,84,89,93,94,107,118,129,145,147,168,169,……,999954,999974,999980

代码合并之后,排序执行时间变慢了,这是为什么呢?没有想明白……难道跟cpu的运行有关系?


哎,我的小破本儿果然运算能力慢啊!



0 0
原创粉丝点击