您的位置:首页 > 其它

冒泡排序和选择排序以及选择排序的优化

2017-05-02 08:10 381 查看
       冒泡排序:两个相邻的数据两两相比,如果是从小到大排列,将较大的数据换位到较小数后面,这样第一轮结束,最后一个数据是最大的数据,因为总是把较大的数据换到后面,再进行第二轮,第三轮(此时已经排好序的数据可以不再参与排序,提高效率)......当第二个数据确定时,第一个数据也就确定了,排序结束。大圈套小圈思想,外层循环控制次数,内层循环控制比较的数据。

      选择排序和冒泡会用到数据的位置交换,所以为了提高代码复用性,我们先写一段数据位置交换的代码: public static void swap (int[] arr,int a,int b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}      以下是冒泡排序;
public static void chooseMaoPao(int [] arr){
for (int x=0;x<arr.length-1 ;x++ ) {           //这里 -1 是当第二个数据确定,第一个数据也确定了,可以少比较一次
for (int y=0;y<arr.length-1-x;y++ ) {  //这里 -x 是已经排过序的数据可以不再参与排序,提高效率,虽然不-x也是可以的
if (arr[y]>arr[y+1]) {         //判断两个数据的大小(将较大数换到后面)
swap(arr,y,y+1);       //调用swap方法完成两个数据交换位置
}
}

}
}
      选择排序:选择排序是从第一个小标的数据开始,以后的每一个数据都与它比较一次,将较小者放在第一个位置上,这样比到最后一个数据,第一个位置的数据就确定了;再进行第二个位置的确定,以后的每一个数据与第二个位置的数据进行比较,较小者放在第二个位置上(假定数据从小到大排序)。直到确定倒数第二个位置上的数据,那么最后一个位置的数据也就确定了,排序结束。同样,大圈套小圈思想。
       以下是选择排序:

public static void choosePaiXu(int [] arr){
for (int x=0;x<arr.length-1 ;x++ ) { //这里 -1 当倒数第二个位置的数据确定,最后一个位置的数据也就确定了
for (int y=x+1; y<arr.length;y++ ) { //这里 y=x+1,0-x是排过序的位置,x+1是指从尚未排序的位置开始确定数据的值
if (arr[x]>arr[y]) { //判断两个数据的大小(将较小的数据放在要确定的位置上)
swap(arr,x,y); //调用swap方法完成两个数据交换位置
}
}
}
}        写选择排序的时候我们发现,当确定一个位置的时候,只要是发现了比这个位置上的数据更小的数据,我们就要调用swap方法进行两个数据的交换,来达到这个位置上的数据保持在最小,可是这样并不是最优的做法,因为每一次交换就要重新申请临时变量,这样代码的效率比较低。所以我们可以用两个变量来记录较小值的数据和下标,每一次比较是和这个变量比,遇到更小的值就赋值给变量,当比较完之后,这个两个变量记录的就是最小值的数据和下标。此时只需要将最小值的数据与要排位置的数据交换即可。
       以下是优化过的选择排序:

public static void chooseGood(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-1;y++ ) {
if (arr[y]<num) { //如果数据有更小的
num=arr[y]; //记录较小数据值
index=y; //记录较小数据下标
}
}
if (index!=x) { //判断较小值的下标与当前位置下标是否一致(也就是说当前位置是否本来就是最小值)
swap(arr,x,index); //利用较小值的数据下标和当前位置下标来交换两者的值
}
}
}       然鹅……我们折腾这么久,其实Java中有能够排序的方法   Arrays.sort(arr);   只要传数组名进去,Java就会帮你排好序,不得不说Java真是一门贴心的语言呀,但是Java有,别的语言不一定有,所以必要的算法还是要懂滴。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐