大话 选择排序和冒泡排序的区别

通常来说冒泡排序的解法 比较两个相邻的元素,升序的话就是 如果那个元素大,就放后面。降序的话就是把小元素放在元素末尾。
一边比一边交换相邻位置,直到数组结束时,最大的被交换到数组最后一个下标。(升序)
通常版:冒泡排序代码

public static void main(String[] args) {
        int a[]={6,4,3,5,2,1};
        for(int i=0;i<a.length;i++){//比较的次数
            for(int j=0;j<a.length-1-i;j++){
                if(a[j]>a[j+1]){//比较大小
                //交换 把大的交换到最后一个元素
                    int temp =a[j+1];
                    a[j+1]=a[j];
                    a[j]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(a));
    }

想过没有,两两比较元素,每次比较两个元素我把最小的放在最前面不行吗?
int a[]={6,4,3,5,2,1};
如上的数组
第一大轮比较开始
第一次比较 第一个元素的值是6和 第二个元素的值是4 比较4小,交换位置, 把4放在第一个下标位置。(专业术语下标是从0开始,这里为了理解方便。)
交换后结果 : int a[]={4,6,3,5,2,1};
第二次比较 第一个元素的值4和第3个元素的值3 比较 3小,交换位置把3放到一个下标位置
交换后结果 : int a[]={3,6,4,5,2,1};
第三次次比较 第一个元素的值3和第4个元素的值5 比较 3小,不需要交换位置。
交换后结果 : int a[]={3,6,4,5,2,1};
第四次比较 第一个元素的值3和第5个元素的值2 比较 2小,交换位置把2放到一个下标位置
交换后结果 : int a[]={2,6,4,5,3,1};
第五次比较 第一个元素的值2和第6个元素的值1 比较 1小,交换位置把1放到一个下标位置
交换后结果 : int a[]={1,6,4,5,3,2};
此刻比完第一轮,第一个元素确定是1,下次从第二个元素开始比,把小的放在第二个下标位置。
第二大轮比较开始
从元素第二个位置比较因为已经确定了第一个位置是最小元素。
第一次比较 第二个元素的值6和第3个元素的值4 比较 4小,交换位置把4放到二个下标位置
交换后结果 : int a[]={1,4,6,5,3,2};
第二次比较 第二个元素的值4和第4个元素的值5 比较 4小,不需要交换位置。
交换后结果 : int a[]={1,4,6,5,3,2};
第三次比较 第二个元素的值4和第5个元素的值3 比较 3小,交换位置把3放到二个下标位置
交换后结果 : int a[]={1,3,6,4,3,2};
……
……
按照这个逻辑比较,一直比下去。直到比完最后一个元素,结束。
以上就是选择排序的逻辑。他是固定最小元素在第一位,和后面的每一个元素比较,小的就放在前面(升序描述)
以下为代码实现。

//第一次循环 拿第0个下标和所有的元素进行比较,只要是小的就
for (int i = 0; i <a.length; i++){
            for (int j = i+1; j<a.length; j++){
            //相邻元素比较大小,如果小的元素本来就在大元素左边,则位置不变。否则交换他们的位置。
                if (a[i] < a[j]){
                    //元素位置不变
                }else {
                    //交换元素位置
                    int p = a[i]; //先把下标为i的元素取出来放到一个新变量中
                    a[i] = a[j]; // 然后把下标为i的 等于下标为j的 交换元素
                    a[j] = p; //下标为j的 等于下标为i的
                }
            }
        }

写在最后,选择排序的交换元素这个操作可以放在循环遍历完之和。只需把最小元素的下标记下来即可。为了方便小白理解所以每次交换,以便看清楚排序的过程。
以下是 交换元素 行为放在最后的写法,小白可以不看。

for(int i=0;i<a.length-1;i++){//比较的次数
            int midIndex =i ;//最小元素索引
            for(int j=i+1;j<a.length;j++){
                if(a[midIndex]>a[j]){
                    midIndex=j;//找到最小值;midIndex记录最小值所在位置
                }
            }
//            交换,且一趟比较完成,只交换一次
            int temp =a[midIndex];
            a[midIndex]=a[i];
            a[i]=temp;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值