java版选择排序和插入排序

排序算法不论在c语言,java,.net,php都很重要,冒泡排序、选择排序、插入排序是用的比较多的。个人觉得冒泡排序比较好理解,无非就是交换位置的过程,如下所示


public class BubbleSort{
     public static void main(String[] args){
         int score[] = {67, 69, 75, 87, 89, 90, 99, 100};
         for (int i = 0; i < score.length -1; i++){    //最多做n-1趟排序
             for(int j = 0 ;j < score.length - i - 1; j++){   
                 if(score[j] < score[j + 1]){    //把小的值交换到后面
                     int temp = score[j];
                     score[j] = score[j + 1];
                     score[j + 1] = temp;
                 }
             }           
             System.out.print("第" + (i + 1) + "次排序结果:");
             for(int a = 0; a < score.length; a++){
                 System.out.print(score[a] + "\t");
             }
             System.out.println("");
         }
             System.out.print("最终排序结果:");
             for(int a = 0; a < score.length; a++){
                 System.out.print(score[a] + "\t");
        }
     }
 }


但是像选择排序和插入排序理解起来会稍微困难一些,这2种排序和冒泡有很大的不同,先来看看插入排序

1.插入排序:

将n个元素的数列分为已有序和无序两个部分,如
插入排序过程示例





下所示:
{{a1},{a2,a3,a4,…,an}}
{{a1⑴,a2⑴},{a3⑴,a4⑴ …,an⑴}}
{{a1(n-1),a2(n-1) ,…},{an(n-1)}}
每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。



这种方式的排序主要就是为待插入的数找合适位置,之后插入变为新数组,在重复同样的操作,下面是我写的一段java代码

package org.lxh;
public class InsertSort {
    /**
     *插入排序
     */
    public static void main(String[] args) {
        int arr[]={23,6,45,8,7,24,-2};
        for(int i=1;i<arr.length;i++){
            //insertVal是准备插入的数
            int insertVal=arr[i];
            int insertIndex=i-1;
            //如果待插入的数小于前一个数,则把较大的数移动到后面
            while(insertIndex>=0&&insertVal<arr[insertIndex]){
                arr[insertIndex+1]=arr[insertIndex];
                //考虑到类似-2这样的情况,还必须往前面找合适位置
                insertIndex--;
            }
            //到这里为止我们就为要插入的数据找到了位置
            arr[insertIndex+1]=insertVal;
                                                                                            
        }
        for(int k=0;k<arr.length;k++){
                System.out.println(arr[k]);
        }
    }
}


对于这段代码可能在 insertIndex-- 这个地方理解起来很困难,这里这样写是为了考虑类似-2的这种情况,不是交换一次就可以。


2.选择排序,这种排序方式有稍微简单些,一般就是先找一个最小的数,可以假设是任意一个,再和后面的比较如果后面的小于前面的说明假设不成立,则修改假设的值,之后交换。

下面是一点资料

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。

下面是java的代码实现:

package org.lxh;
public class SelectSort {
    /**
     * 选择排序
     */
    public static void main(String[] args) {
        int arr[]={90,23,45,8,7,24};
        int temp=0;
              
        for(int i=0;i<arr.length-1;i++){
            //假设arr[i]是最小的数
            int minVal=arr[i];
            //最小的数对应的下标
            int minIndex=i;
            //从后一个数知道数组末尾验证我们前面的假设是否正确
            for(int j=i+1;j<arr.length;j++){
                //假设不成立,修改minVal和minIndex
                if(minVal>arr[j]){
                    minVal=arr[j];
                    minIndex=j;
                }
            }
            //交换
            temp=arr[i];
            arr[i]=arr[minIndex];
            arr[minIndex]=temp;
        }
        for(int k=0;k<arr.length;k++){
            System.out.println(arr[k]);
        }
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值