冒泡排序、简单选择排序、插入排序、希尔排序、堆排序代码

冒泡:设置i和i+1两个游标,从数组第一位开始两两比较,,每比较一轮就可以确定一个值,所有最多进行n-1轮。

public static void bubbleSort(int[] arr) {
    //控制轮数
    for(int i=0;i<arr.length;i++) {
	    //设置j游标指向第一个元素
	    for(int j=0;j<arr.length-1;j++) {
	        //如果第j个元素大于第j+1个元素,交换
	        if(arr[j]>arr[j+1]) {
	            int temp=arr[j];
		        arr[j]=arr[j+1];
		        arr[j+1]=temp;
	        }	
	    }
    }
    System.out.println(Arrays.toString(arr));
}

简单选择排序:在待排序的数组中找到最小值(最大值),然后和数组第一个数(最后一个数)交换

public static void selectSort(int[] arr) {
    for(int i=0;i<arr.length;i++) {
	    //先假设第一个是最小值
	    int minindex=i;
	    int min=arr[i];
	    //判断是否有比第一个小的,有就把它设为最小值
	    for(int j=i;j<arr.length;j++) {
	        if(min>arr[i]) {
	            min=arr[j];
		        minindex=j;
	        }
	    }
	    //把最小值和待排序的第一位交换
	    arr[minindex]=arr[i];
	    arr[i]=min;
    }
    System.out.println(Arrays.toString(arr));
}

插入排序:插入的数越小,后移的次数越多,影响效率

//插入排序
public static void insertSort(int[] arr) {
    //设置i游标,指向第二个元素,每轮往后移动1位
    for(int i=1;i<arr.length;i++) {
        //设置j游标,指向i游标前一个元素,依次往前移动1位
	    for(int j=i-1;j>=0;j--) {
	        //判断j游标和j游标后一个元素大小,并排序
	        if(arr[j]>arr[j+1]) {
	            int temp=arr[j+1];
		        arr[j+1]=arr[j];
		        arr[j]=temp;
	        }
	    }
    }
    System.out.println(Arrays.toString(arr));
}

希尔排序

//希尔排序
public static void shellSort(int[] arr) {
    //把数组按步长分开,进行插入排序,每一轮结束步长除以2
    for(int grap=arr.length/2;grap>0;grap/=2) {
        //设置i游标,指向步长所在的元素,并依次往后移动
	    for(int i=grap;i<arr.length;i++) {
	        //设置j游标,指向和i游标相隔一个步长的元素
	        for(int j=i-grap;j>=0;j-=grap) {
		        //判断j游标和i游标所指的元素大小
		        if(arr[j]>arr[j+grap]) {
		            int temp=arr[j+grap];
		            arr[j+grap]=arr[j];
		            arr[j]=temp;
		        }
	        }
        }
    }
    System.out.println(Arrays.toString(arr));
}

堆排序

import java.util.Arrays;

public class HeapSort {
    public static void main(String[] args) {
	    int[] arr=new int[] {1,4,2,523,74,12};
	    //数组上的p指针
	    for(int p=arr.length-1;p>=0;p--) {
	        Heap(arr,p,arr.length);
	    }
	    //维护
	    for(int i=arr.length-1;i>0;i--) {
	        //堆顶元素和堆底元素互换
	        int count=arr[i];
	        arr[i]=arr[0];
	        arr[0]=count;
	        Heap(arr,0,i);
	    }
	    System.out.println(Arrays.toString(arr));
    }
    // 将这个arr直接当中完全二叉树进行处理,形成大顶堆
    public static void Heap(int[] arr,int parent,int length) {
        //定义临时空间
        int temp=arr[parent];
        //左孩子
        int lChild=2*parent+1;
        while(lChild<length) {
            //定义右孩子
	        int rChild=lChild+1;
	        // 如果有右孩子,并且右孩子的值大于左孩子的值我们就将lChild指针指向rChild
	        if(rChild<length && arr[lChild]<arr[rChild]) {
	            lChild++;
	        }
	        // 让 temp和arr[Child]进行对比
	        if(temp>=arr[lChild]) {
	            break;
	        }
	        //将孩子节点的值,放入到父节点
	        arr[parent]=arr[lChild];
	        //父节点继续向下去走
	        parent=lChild;
	        lChild=2*lChild+1;
        }
        arr[parent]=temp;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

licungeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值