排序法之选择排序法

来源:互联网 发布:485通讯端口电压多少 编辑:程序博客网 时间:2024/06/05 21:00

选择排序:

首先通过数组中元素的比较方式来分析:
这里写图片描述

用数组中第一个角标的元素与数组中第二个角标的元素进行比较,发现9比6大,进行位置置换,此处应该定义一个三方变量,用来记录住置换过程的元素值,然后再用第一个角标的元素与下一个角标元素进行比较,按照全面的原则进行置换位置,如果前者小于后者,则不置换位置,一次比较,当第一轮结束之后第一个角标出能取的该数组中最小的元素的值,然后再用第一个角标的元素开始和下一个角标的元素进行比较,同理,当第二轮结束后,第二个角标处获取了该数组中的第二小的值。所以我们发现当依次这样比较下去,就可以对数组中的元素进行排序,当比较到arr.length-1元素时,发现只剩下这一个元素,没有其他元素和它进行比较了。
思路:
1、首先定义一个功能函数对数组进行排序,
2、明确结果,没有返回值,因为它只是对数组进行排序的一个动作,明确是否有未知内容参与运算,有,数组类型int[] arr
实现代码:

public static void selectSort(int[] arr){    for(int x=0;x<arr.length-1;x++){        for(int y=x+1;y<arr.length;y++){            if(arr[x]>arr[y]){                int temp=arr[x];                arr[x]=arr[y];                arr[y]=temp;            }        }    }}

优化后的选择排序:
从上面的排序图中我们可以知道,对数组中元素进行置换位置的次数过多,也就是对堆内存的操作频繁,降低了性能,下面我们可以通过这种方式对性能优化。
这里写图片描述

思路:
在栈内存中我们定义两个变量,分别用来记录较小的元素的值和较小元素的角标,然后对其进行初始化,至于初始化的值只要是数组中的任意元素即可,然后拿数组中的元素与它进行比较,如果发现拿去比较的元素比变量中记录的数值要小,那么就进行位置置换,并记录下较小的元素的角标,依次把数组中的元素遍历完,就可以获取数组中的最小元素的值和角标,然后我们拿初始化的值和获取的最小的元素进行位置的置换,这样以来当我们获取了数组中的元素的最小的时候,堆内存中的只用操作一次位置即可,这样的就提高性能。
实现代码:

public static void selectSort_2(int[] arr){    for(int x=0;x<arr.length-1;x++){        int num=arr[x];        int index=x;        for(int y=x+1;y<arr.length;y++){            if(num>arr[y]){                num=arr[y];                index=y;            }        }        if(index!=x){            int temp = arr[x];            arr[x] = arr[index];            arr[index] = temp;        }    }}
0 0
原创粉丝点击