常见排序方法1

1.直接选择排序

相比冒泡排序,会大大减少交换次数
思想:找到n个元素中最小的一个数放置在数组首位,再在剩余n-1个数中选取最小的放在数组的第二位,以此类推。

import java.util.Arrays;

public class SelectSort {
    public static void selectsort(int[] arr){
        for(int i = 0;i<arr.length-1;i++){
            int index = i;        //设置索引index指向最小元素
            int j;
            for (j=i+1;j<arr.length-1;i++){
                if(arr[index]>arr[j]){
                    index = j;
                }
            }
            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }

    }

    public static void main(String[] args) {
        int[] arr = {1,2,3,5,7,2,9,0,5};
        selectsort(arr);
        for (int i:arr
             ) {System.out.println(arr[i]);

        }
    }
}

2.插入排序

数据总量庞大时,可以用链表解决问题
思想:将无序数组插入有序数组中。先将数组看成只有首个元素,其次添加第二个元素并在数组中找到合适位置插入,按此法将剩余元素依次插入。当所有元素插入之后即可得到结果。

public static void insertion(int arr[]) {  //插入排序
        for(int i=2;i<arr.length;i++){     //i代表本次循环中元素的个数
            int temp = arr[i-1];            //定义临时变量temp存放新插入的数
            for(int j=i-1;j>1;j--){           //j代表同新插入元素arr[i-1]相比较的元素下标

                if(temp<arr[j-1]){//依次比较当新插入数<arr[j-1]时后面数组下标+1
                 arr[j] = arr[j-1];
                 arr[j-1] = temp;
                }
                else {                    //否则不用前移
                    arr[j] = temp;
                    break;}
            }
        }
    }

3.希尔排序

数组基本有序的情况下,是直接插入算法的优化

思想:先设置一个较大的增量,再将数列按增量分组,对每组使用直接插入算法。再设置一个小于原先增量的增量,实施同样操作。当增量减为1后,排序得到的结果即最终结果(增量为1时相当于将一个基本有序的数列进行直接插入排序)

public static void shell(int[] arr){
    int increaseNum =arr.length/2;             //设置增量
    while(true){
        for(int i=0;i<arr.length;i++) {     //将数组分为n组
          for(int j=i;j<arr.length;j+=increaseNum){ //得到每组的确切值
              for(int k=j;k-increaseNum>0;k-=increaseNum){
                  int temp = arr[j];                     //定义中间变量temp存放新插入的值
                  if(arr[k-increaseNum]>temp){           
                      arr[k] = arr[k-increaseNum];
                   }
                  else {
                      break;
                  }
                  arr[k-increaseNum] = temp;
              }
          }
     }

        if(increaseNum == 1){
            break;
        }
        increaseNum=increaseNum/2;
    }
}

这个其实不难,但就是就是写起来有点恶心。毕竟三重循环脑子里不容易绕过来,很容易在边界和覆盖方面出问题。

4.快速排序

冒泡排序的升级,已知最快的排序方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值