十大排序算法之简单排序

1.插入排序

概念:将每一个后排元素插入到前排已经有序的牌中的适当位置,称之为插入排序。

过程简单描述:

1、从数组第2个元素开始抽取元素。

2、把它与左边第一个元素比较,如果左边第一个元素比它大,则继续与左边第二个元素比较下去,直到遇到不比它大的元素,然后插到这个元素的右边。

3、继续选取第3,4,….n个元素,重复步骤 2 ,选择适当的位置插入。

注解版:

public static void insertionSort(int[] arr) {
    int n = arr.length;
    
    for (int i = 1; i < n; ++i) {//常规操作
        int key = arr[i];//需要先把值取出来不然就被覆盖了,额外空间+1
        
        // 将arr[0..i-1]中大于key的元素向后移动一位
        int j = i - 1;//排序算法都是二维的,肯定有个j。
        while (j >= 0 && arr[j] > key) {//条件最重要,当符合这些条件就做以下操作。
            arr[j + 1] = arr[j];//两步目的是让元素往后移。
            --j;
        }
		
        arr[j + 1] = key;//把取出来的值再放回去
    }
}

简洁版:

public static void insertionSort(int[] arr) {
    int n = arr.length;
        
      for (int i = 1; i < n; ++i) {
            int key = arr[i];
            
            int j = i - 1;
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                --j;
            }
			
            arr[j + 1] = key;
        }
    }
}

2.选择排序

概念:每次从待排序列中选出一个最小值,然后放在序列的起始位置,直到全部待排数据排完即可。

过程简单描述:

首先,将0号元素取出来默认为最小值。其次,那这个值跟后面所有值比较,如果大就交换,一直到数组结尾。最后将找到的这个最小值放到0号元素。循环做这个事,做到倒数第一个元素或者倒数第二个元素(猜猜为啥)。

public static int[] selectSort(int[] arr) {
    for(int i=0; i<arr.length-1;i++){
        int min=arr[i];

        for(int j=i+1; j<arr.length;j++){
            if(min>arr[j]){//找出最小的交换位置
                int temp=min;
                min = arr[j];
                arr[j]= temp;
            }
        }
        arr[i]= min;//把最小的放到这个位置
    }
    return arr;
}
public static int[] selectSort(int[] arr) {
    for(int i=0; i<arr.length-1;i++){
        int min=arr[i];

        for(int j=i+1; j<arr.length;j++){
            if(min>arr[j]){
                int temp=min;
                min = arr[j];
                arr[j]= temp;
            }
        }
        arr[i]= min;
    }
    return arr;
}

3.冒泡排序

概念:就像水中的气泡一样,每次我都把最大的或最小的放到最后面。

过程简单描述:

遍历未被固定的那些数,让最大的数升到最右边固定起来,但这个升的过程是仅前一个和后一个互换位置,这点是与选择排序的区别,这也是冒泡排序稳定但选择排序不稳定的原因,因为选择排序是跳跃着互换,很容易将原有的顺序打乱。多次循环遍历结束后,所有的数就排好序了。

public static int[] maoPaoSort(int[] arr) {
    for(int i=arr.length-1; i>0;i--) {
        for (int j=0; j<i; j++) {
//主要是这里,要把最大值放到后面,并且放好的不能动了,那一定不是小于N而是小于一个动态的数,
//那这个是数是靠i来控制的。
            if(arr[j]>arr[j+1]){
                int temp= arr[j+1];
                arr[j+1]=arr[j];
                arr[j]=temp;
            }
        }
    }
    return arr;
}
public static int[] maoPaoSort(int[] arr) {
    for(int i=arr.length-1; i>0;i--) {
        for (int j=0; j<i; j++) {
            if(arr[j]>arr[j+1]){
                int temp= arr[j+1];
                arr[j+1]=arr[j];
                arr[j]=temp;
            }
        }
    }
    return arr;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值