IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> java--排序算法--插入;希尔;选择;堆;冒泡 -> 正文阅读

[数据结构与算法]java--排序算法--插入;希尔;选择;堆;冒泡


//1.插入排序
public class TestSort {
    //升序排序
    public static void insertSort(int[] array) {
        //通过bound来划分出两个区间
        //[0,bound)已排序区间
        //(bound,size]待排序区间
        for (int bound = 1;bound < array.length;bound++) {
            int v = array[bound];
            int cur = bound - 1;//已排序区间的最后一个元素下标
            for (;cur >= 0;cur--){
                //注意!!!这里如果是>=,插入排序就不是稳定排序了
                if (array[cur] > v){
                    array[cur + 1] = array[cur];
                }else {
                    //此时说明已经找到了合适的位置
                    break;
                }
            }
            array[cur + 1] = v;
        }
    }

    //2.希尔排序
    public static void shellSort(int[] array) {
        int gap = array.length / 2;
        while(gap > 1) {
            //需要循环进行分组插排
            insertSortGap(array,gap);
            gap = gap / 2;
        }
        insertSortGap(array,1);
    }
    private static void insertSortGap(int[] array,int gap) {
        //通过bound来划分出两个区间
        //[0,bound)已排序区间
        //(bound,size]待排序区间

        //当把gap替换成1的时候,理论上这个代码就和前面的插排代码一模一样
        for (int bound = gap;bound < array.length;bound++) {
            int v = array[bound];
            int cur = bound - gap;//这个操作是在找同组中的上一个元素
            for (;cur >= 0;cur -= gap){
                //注意!!!这里如果是>=,插入排序就不是稳定排序了
                if (array[cur] > v){
                    array[cur + gap] = array[cur];
                }else {
                    //此时说明已经找到了合适的位置
                    break;
                }
            }
            array[cur + gap] = v;
        }
    }


    //3.选择排序
    public static void selectSort(int[] array) {
        for (int bound = 0;bound < array.length;bound++) {
            //以bound位置的元素作为擂主,循环从待排序区间中取出元素和擂主比较
            //如果打擂成功,就和擂主交换
            for (int cur = bound + 1;cur < array.length;cur++) {
                if (array[cur] < array[bound]) {
                    int tmp = array[cur];
                    array[cur] = array[bound];
                    array[bound] = tmp;
                }
            }
        }
    }

    //4.堆排序
    private static void swap(int[] array,int i,int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }
    public static void heapSort(int[] array) {
        //先建立堆
        createHeap(array);
        //循环把堆顶元素交换到最后,并进行调整堆
        //循环此时是length - 1,当堆中只剩一个元素的时候,也就一定是有序的了
        for (int i = 0;i < array.length - 1;i++) {
            //当前堆的元素个数
            int heapSize = array.length - i;
            //交换堆顶元素和堆的最后一个元素
            //堆的元素个数是array.length - i
            //堆的最后一个元素下标array.length - i - 1
            swap(array,0, heapSize - 1);
            heapSize--;//排除最后一个元素
            //交换完成之后把最后一个元素从堆中删除,堆的长度进一步减小为array.length - i - 1
            //数组中[0,array.length - i - 1)待排序区间,[array.length - i - 1,array.length)已排序区间
            //“差1问题”带入验证
            myShiftDown(array,heapSize,0);
        }
    }

    private static void createHeap(int[] array) {
        for (int i = (array.length - 1 - 1) / 2;i >= 0;i--) {
            myShiftDown(array,array.length,i);
        }
    }


    private static void myShiftDown(int[] array,int heapLength,int index) {
     int parent = index;
     int child = 2 * parent + 1;
     while(child < heapLength) {
         if (child + 1 < heapLength && array[child + 1] > array[child]) {
             child = child + 1;
         }
         //条件结束意味着child已经是左右子树比较大的那个
         if (array[child] > array[parent]) {
             swap(array,child,parent);
         }else {
             break;
         }
         parent = child;
         child = 2 * parent +1;
     }
}


//5.冒泡排序
    public static void bubbleSort(int[] array) {
        //按照每次找最小的方式来排序(从后往前比较交换)
        for (int bound = 0; bound < array.length;bound++) {
            //[0,bound)已排序区间;[bound,size)待排序区间
            //cur > bound而不是 >=,当bound为0时,如果>=,cur也为0,cur-1也就下标越界了
            for (int cur = array.length-1;cur > bound;cur--) {
                //此处cur-1是因为cur初始值是array.length - 1,如果取cur+1下标的元素就越界了
                //此处的条件如果写成 >=同样无法保证稳定性
                if (array[cur - 1] > array[cur]) {
                    swap(array,cur - 1,cur);
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = {9,5,6,8,3, 1};
       heapSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-19 12:08:35  更:2021-10-19 12:10:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:30:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码