当前位置: 首页 > news >正文

数据结构排序算法合集

快排

private static void quickSort(int[] ret) {
    quick(ret,0,ret.length-1);
}
private static void quick(int[] ret, int left, int right) {
    if(left>=right)     记一下这里是大于等于   

return;
    int pivot = partition(ret,left,right);
    quick(ret,left,pivot-1);
    quick(ret,pivot+1,right);
}
private static int partition(int[] ret, int left, int right) {
    int key = ret[left];
    int i = left;
    while(left<right){
        while(left<right&&ret[right]>=key){
            right--;
        }
        while(left<right&&ret[left]<=key){
            left++;
        }
        swap(ret,left,right);
    }
    swap(ret,i,left);
    return left;
}
private static void swap(int[] ret, int left, int right) {
    int tmp = ret[left];
    ret[left] = ret[right];
    ret[right] = tmp;
}

归并


    private static void mergeSort(int[] ret) {
        merge(ret, 0, ret.length - 1);
    }
    private static void merge(int[] ret, int left, int right) {
        if (left >= right) 记一下这里是大于等于
            return;
// 1. 根据中间点划分区间
        int mid = (left + right) / 2;
// [left, mid] [mid + 1, right]
// 2. 先把左右区间排个序
        merge(ret, left, mid);
        merge(ret, mid + 1, right);
// 3. 合并两个有序数组
        int[] tmp = new int[ret.length];
        int cur1 = left, cur2 = mid + 1, i = 0;
        while (cur1 <= mid && cur2 <= right)
            tmp[i++] = ret[cur1] <= ret[cur2] ? ret[cur1++] : ret[cur2++];
// 处理没有遍历完的数组
        while (cur1 <= mid)
            tmp[i++] = ret[cur1++];
        while (cur2 <= right)
            tmp[i++] = ret[cur2++];
// 4. 还原
        for (int j = left; j <= right; j++)
            ret[j] = tmp[j - left];
    }

}

堆排

private static void heapSort(int[]  array) {
    for(int parent=(array.length-1-1)/2;parent>=0;parent--){
          siftDown(array,parent,array.length);
    }
    int end = array.length - 1;
    while(end>0){
        swap(array,0,end);
        siftDown(array,0,end);
        end--;
    }
}

private static void swap(int[] array, int a, int b) {
    int tmp = array[a];
    array[a] = array[b];
    array[b] = tmp;
}

private static void siftDown(int[] array, int parent, int end) {
    int child = 2 * parent + 1;
    while(child<end){
        if(child+1<end&&array[child+1]>array[child]){
            child++;
        }
        if(array[child]>array[parent]) {
            swap(array, child, parent);
            parent = child;
            child = 2 * parent + 1;
        }else {
            break;
        }
    }
}

选择

private static void selectSort(int[] array) {
    for (int i = 0; i < array.length; i++) {
        int minIndex = i;
        for (int j = i+1; j < array.length; j++) {
            if(array[j]<array[minIndex]){
                minIndex = j;
            }
        }
        swap(array,minIndex,i);
    }
}

冒泡

private static void bubbleSort(int[] array) {
    for (int i = 0; i < array.length-1; i++) {
        boolean flag = false;
        for (int j = 0; j < array.length-1-i; j++) {
            if(array[j]> array[j+1]){
                swap(array,j,j+1);
                flag = true;
            }
        }
        if(!flag)
             return ;
    }
}

插入

private static void insertSort(int[] array) {
    for (int i = 1; i < array.length; i++) {
        int tmp = array[i];
        int j = i-1;
        for (; j >=0; j--) {
            if(array[j]>tmp){
                array[j+1] = array[j];
            }else{
                break;
            }
        }
       array[j+1] = tmp;
    }
}

希尔(gap是几,分成几组)

private static void shellSort(int[] array){
    int gap = array.length;
    while(gap>1){

//  gap必须写在前面
         gap/=2;
         shell(array,gap);
    }
}

private static void shell(int[] array, int gap) {
    for (int i = gap; i < array.length; i++) {
        int tmp = array[i];
        int j = i-gap;
        for (; j >=0; j-=gap) {
            if(array[j]>tmp){
                array[j+gap] = array[j];
            }else{
                break;
            }
        }
        array[j+gap] = tmp;
    }
}

相关文章:

  • Docker 快速搭建一个基于 GPT-Vis 组件的统计图表生成服务
  • Python 目录操作详解
  • 【学习笔记】nlohmannjsoncjson
  • 【Manus第三篇-Prompt优化】两周实战,一套注意力视角的prompt优化框架,真的有用!
  • 安装VSCode的时候没勾选将“通过Code打开”操作添加到Windows资源管理器目录上下文菜单(右键VSCODE打开)
  • 计算机视觉课程笔记-机器学习中典型的有监督与无监督学习方法的详细分类、标签空间性质、解释说明,并以表格形式进行总结
  • WebFuture:模板如何加上简繁切换?
  • Vue3+TypeScript中v-bind()的原理与用法
  • 【Docker基础】Docker核心概念:命名空间(Namespace)之User详解
  • 66、【OS】【Nuttx】【构建】System.map文件生成(上)
  • 1572. 矩阵对角线元素的和
  • DELL R730XD服务器调整风扇转速
  • [linux] ftp上传文件
  • 设计模式笔记_创建型_单例模式
  • 服务器静态ip,网关不能占用*.*.*.1
  • LeetCode--33.搜索旋转排序数组
  • Distilling Knowledge via Knowledge Revie
  • 4. 时间序列预测的自回归和自动方法
  • 【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(软件篇)(二)
  • TortoiseSVN迁移到本地git
  • 河北精品网站建设/合肥seo快排扣费
  • wordpress做视频站/长沙官网seo收费标准
  • 专业的天津网站建设/百度站长工具app
  • 白银市城县建设局网站/用模板快速建站
  • 网站建设入什么科目/广东省人大常委会
  • 网站建设对促进部门工作的益处/互联网推广营销