排序算法--选择排序

来源:互联网 发布:华为电信软件业务部 编辑:程序博客网 时间:2024/05/13 17:02

选择排序也是一个很简单的排序算法,我来备忘一下。。

原理:我们仍旧选择排序一个整数组成的数组,升序排列。每次遍历数组中还没有排好序的部分,在其中选择一个最小的,放到最左边的位置,等整个数组中的元素全部放到该放的位置即停止。

步骤:初始化遍历计数i和j,i代表每次遍历要放到最终位置的元素的下标,当然了,也代表着遍历第几次数。j就用来遍历还没有放好的部分,从中去选择一个最小的元素。需要注意的是,我们是一个个比较,但是并不是一个个交换,我们弄一个临时变量指向此次遍历中最小的元素,也记录它的值,最后交换i位置的元素和最小元素即可。

分析:先说时间复杂度,比较的次数是n(n-1)/2,交换n次(此处也要说一下,可以遍历n-1次,最后剩下一个元素不再遍历也可以,无关大局,至于交换次数,如果是本来就升序,就不需要交换了),所以时间复杂度就是O(N^2)。关于空间,当然不需要额外的,那就是原地的了。至于稳定性,比如数组[2,2,1],第一次交换会将1和第一个2交换,那么相等元素就被变顺序了,所以它不稳定。

代码展示

public class SelectSort {public static void main(String[] args){int[] array = {7, 11, 5, 8, 7, 2, 10, 1};System.out.print("待排序数组:");//打印排序之前的样子for(int k : array)System.out.print(k + " ");System.out.println();sort(array);//排序之中System.out.print("排序结果:");//排序之后for(int k : array)System.out.print(k + " ");}public static void sort(int[] target){if(target==null || target.length<=1)//为空或者个数小于等于1则直接返回return;int i=0,j=0,minPoint=-1,mininum=Integer.MAX_VALUE;for(i=0;i<target.length;i++){minPoint = i;//记录此趟遍历的第一个数为最小,标记其下标mininum = target[i];//记录这个数for(j=i+1;j<target.length;j++){if(target[j]<mininum){minPoint = j;mininum = target[j];}}if(i!=minPoint)exchange(target,i,minPoint);System.out.print("第"+(i+1)+"趟排序结果:");//每一趟排序后的样子for(int k : target)System.out.print(k + " ");System.out.println();}}public static void exchange(int[] target,int left,int right){int tmp =  target[left];target[left] = target[right];target[right] = tmp;}}

排序结果:

待排序数组:7 11 5 8 7 2 10 1 第1趟排序结果:1 11 5 8 7 2 10 7 第2趟排序结果:1 2 5 8 7 11 10 7 第3趟排序结果:1 2 5 8 7 11 10 7 第4趟排序结果:1 2 5 7 8 11 10 7 第5趟排序结果:1 2 5 7 7 11 10 8 第6趟排序结果:1 2 5 7 7 8 10 11 第7趟排序结果:1 2 5 7 7 8 10 11 第8趟排序结果:1 2 5 7 7 8 10 11 排序结果:1 2 5 7 7 8 10 11 

每一趟遍历都是放好一个最左边的元素,我给排了n次,n-1次也可以的。

最后,本人能力有限,如果有表述不当的地方,欢迎您指正,先在此谢过了~~

0 0
原创粉丝点击