改进排序算法:快速排序(对冒泡排序的改进)

2023-11-03

快速排序的基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

Partition函数的作用:选取当中的一个关键字,将它放到一个位置,使得它左边的值都比它小,右边的值比它大,这样的关键字被称为枢轴。

一:取low端的值作为枢轴记录,从high端开始交换

import java.util.ArrayList;
import java.util.Arrays;

public class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] arr = {4,5,1,6,2,7,3,8,8,4};
        System.out.println(s.GetLeastNumbers_Solution(arr, 4));   //输出:[1, 2, 3, 4]
    }
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> list = new ArrayList<>();
        if (input.length <= 0 || k <= 0 || k > input.length) return list;
        sort(input, 0, input.length - 1);
        System.out.println(Arrays.toString(input));    //输出:[1, 2, 3, 4, 4, 5, 6, 7, 8, 8]
        for (int i = 0; i < k; i++)
            list.add(input[i]);
        return list;
    }
    private void sort(int[] arr, int low, int high)
    {
        int index;
        if (low < high)
        {
            index = partition(arr, low, high);
            sort(arr, low, index - 1);
            sort(arr, index + 1, high);
        }
    }
    private int partition(int[] arr, int low, int high)
    {
        int flag = arr[low];
        while(low < high)
        {
            while (low < high && arr[high] >= flag)
                high--;
            swap(arr, low, high);
            while(low < high && arr[low] <= flag)
                low++;
            swap(arr, low, high);


        }
        return low;
    }
    private void swap(int[] arr, int i, int j)
    {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}


二:取high端的值作为枢轴记录,从low端开始交换

import java.util.ArrayList;
import java.util.Arrays;

public class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] arr = {4,5,1,6,2,7,3,8,8,4};
        System.out.println(s.GetLeastNumbers_Solution(arr, 4));  //输出:[1, 2, 3, 4]
    }
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> list = new ArrayList<>();
        if (input.length <= 0 || k <= 0 || k > input.length) return list;
        sort(input, 0, input.length - 1);
        System.out.println(Arrays.toString(input));  //输出:[1, 2, 3, 4, 4, 5, 6, 7, 8, 8]
        for (int i = 0; i < k; i++)
            list.add(input[i]);
        return list;
    }
    private void sort(int[] arr, int low, int high)
    {
        int index;
        if (low < high)
        {
            index = partition(arr, low, high);
            sort(arr, low, index - 1);
            sort(arr, index + 1, high);
        }
    }
    private int partition(int[] arr, int low, int high)
    {
        int flag = arr[high];
        while(low < high)
        {
            while(low < high && arr[low] <= flag)
                low++;
            swap(arr, low, high);
            while (low < high && arr[high] >= flag)
                high--;
            swap(arr, low, high);

        }
        return low;
    }
    private void swap(int[] arr, int i, int j)
    {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}


快速排序的复杂度分析:


时间复杂度:

快速排序的时间性能取决于快速排序递归的深度,可以用递归树来描述递归算法的执行情况。若取的枢轴正好是待排序的序列的中间值,则递归树是平衡的,性能也比较好。

在最优情况下,Partition每次都划分得很均匀,如果排序n个关键字,其递归树的深度为[log2n]+1,即仅需递归log2n次,需要时间为T(n)的话,第一次Partition需要对整个数组扫描一遍,做n次比较,然后,获得的枢轴将数组一分为二,各自还需要T(n/2)的时间。不断划分下去。在最优的情况下,快排算法的时间复杂度为O(nlogn)。

在最坏的情况下,待排序的序列为正序或者逆序,每次划分只得到一个比上一次划分少一个记录的子序列,另一个为空。递归树画出来,为一棵斜树。此时需要执行n-1次递归调用,且第i次划分需要经过n-i次关键字的比较才能找到第i个记录,也就是枢轴的位置,最终时间复杂度为O(n^2)。

平均情况下,时间复杂度为O(nlogn)。


空间复杂度:

主要是递归造成的栈空间的使用。

最好情况下,递归树的深度为log2n,空间复杂度为O(logn)。

最坏情况下,需要进行n-1次递归调用,空间复杂度为O(n)。

平均情况下,空间复杂度为O(logn)。


由于关键字的比较和交换是跳跃进行的,快速排序是一种不稳定的排序方法。


快速排序的优化:

一:优化选取枢轴

三数取中法:取三个关键字,先进行排序,将中间数作为枢轴。一般是取左端、右端和中间三个数,也可以随机选取。这样,至少这个中间数一定不会是最小或者最大的数。

三数取中对小数组来说有很大概率可以选择到一个比较好的枢轴,但是对于非常大的待排序的序列还不足以保证能够选择出一个好的枢轴。因此可以九数取中,它先从数组中分三次取样,每次取三个数,三个样品各取出中数,然后从这三个中数当中再取出一个中数作为枢轴。

import java.util.ArrayList;
import java.util.Arrays;

public class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] arr = {4,5,1,6,2,7,3,8,8,4};
        System.out.println(s.GetLeastNumbers_Solution(arr, 4));   //输出:[1, 2, 3, 4]
    }
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> list = new ArrayList<>();
        if (input.length <= 0 || k <= 0 || k > input.length) return list;
        sort(input, 0, input.length - 1);
        System.out.println(Arrays.toString(input));    //输出:[1, 2, 3, 4, 4, 5, 6, 7, 8, 8]
        for (int i = 0; i < k; i++)
            list.add(input[i]);
        return list;
    }
    private void sort(int[] arr, int low, int high)
    {
        int index;
        if (low < high)
        {
            index = partition(arr, low, high);
            sort(arr, low, index - 1);
            sort(arr, index + 1, high);
        }
    }
    private int partition(int[] arr, int low, int high)
    {
        int m = low + (high - low) / 2;
        if (arr[low] > arr[high]) swap(arr, low, high);
        if (arr[m] > arr[high]) swap(arr,m, high);
        if (arr[low] < arr[m]) swap(arr, low, m); //此时,low端的值为中间值
        int flag = arr[low];
        while(low < high)
        {
            /*while (low < high && arr[high] >= flag) //无论从low端开始交换还是从high端开始交换都可以
                high--;
            swap(arr, low, high);
            while(low < high && arr[low] <= flag)
                low++;
            swap(arr, low, high);*/
            while(low < high && arr[low] <= flag)
                low++;
            swap(arr, low, high);
            while (low < high && arr[high] >= flag)
                high--;
            swap(arr, low, high);
        }
        return low;
    }
    private void swap(int[] arr, int i, int j)
    {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

二:优化不必要的交换

同上:取low端的值作为枢轴记录,从high端开始交换;取high端的值作为枢轴记录,从low端开始交换

import java.util.ArrayList;
import java.util.Arrays;

public class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] arr = {4,5,1,6,2,7,3,8,8,4};
        System.out.println(s.GetLeastNumbers_Solution(arr, 4));   //输出:[1, 2, 3, 4]
    }
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> list = new ArrayList<>();
        if (input.length <= 0 || k <= 0 || k > input.length) return list;
        sort(input, 0, input.length - 1);
        System.out.println(Arrays.toString(input));    //输出:[1, 2, 3, 4, 4, 5, 6, 7, 8, 8]
        for (int i = 0; i < k; i++)
            list.add(input[i]);
        return list;
    }
    private void sort(int[] arr, int low, int high)
    {
        int index;
        if (low < high)
        {
            index = partition(arr, low, high);
            sort(arr, low, index - 1);
            sort(arr, index + 1, high);
        }
    }
    private int partition(int[] arr, int low, int high)
    {
        int flag = arr[low];
        while(low < high)
        {
            while (low < high && arr[high] >= flag)
                high--;
            arr[low]= arr[high];
            
            while(low < high && arr[low] <= flag)
                low++;
            arr[high] = arr[low];
        }
        arr[low]= flag;
        return low;
    }
}

三:优化小数组时的排序方案

如果数组非常小,直接插入排序比快速排序更好。(直接插入排序是简单排序中性能最好的)

快速排序中,用到了递归操作,在大量数据排序时,这点性能影响对于它的整体算法优势而言可以忽略。

import java.util.ArrayList;
import java.util.Arrays;

public class Solution {
    public static final int CUTOFF = 7;
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] arr = {4,5,1,6,2,7,3,8,8,4};
        System.out.println(s.GetLeastNumbers_Solution(arr, 4));   //输出:[1, 2, 3, 4]
    }
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {

        ArrayList<Integer> list = new ArrayList<>();
        if (input.length <= 0 || k <= 0 || k > input.length) return list;

        sort(input, 0, input.length - 1);

        System.out.println(Arrays.toString(input));    //输出:[1, 2, 3, 4, 4, 5, 6, 7, 8, 8]

        for (int i = 0; i < k; i++)
            list.add(input[i]);

        return list;
    }
    private void sort(int[] arr, int low, int high)
    {
        int index;
        if ((high - low) > CUTOFF)
        {
            index = partition(arr, low, high);
            sort(arr, low, index - 1);
            sort(arr, index + 1, high);
        }
        else
            InsertSort(arr, low, high);
    }
    private int partition(int[] arr, int low, int high)
    {
        int flag = arr[low];
        while(low < high)
        {
            while (low < high && arr[high] >= flag)
                high--;
            arr[low]= arr[high];

            while(low < high && arr[low] <= flag)
                low++;
            arr[high] = arr[low];
        }
        arr[low]= flag;
        return low;
    }
    private void InsertSort(int[] arr, int low, int high) //直接插入排序
    {
        for (int i = low + 1; i <= high; i++)
        {
            if (arr[i] < arr[i - 1])
            {
                int save = arr[i];
                int j = i - 1;
                for (; j >= 0 && arr[j] > save; j--)
                    arr[j + 1] = arr[j];
                arr[j + 1] = save;
            }
        }
    }
}

四:优化递归操作

sort函数在其尾部有两次递归操作。如果待排序的序列划分极端不平衡,递归深度将趋近于n,而不是平衡时的logn,这不仅仅是速度快慢的问题。

栈的大小是有限的,每次递归调用会耗费一定的栈空间,函数的参数越多,每次递归耗费的空间也越多。

所以要减少递归。

import java.util.ArrayList;
import java.util.Arrays;

public class Solution {
    public static final int CUTOFF = 7;
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] arr = {4,5,1,6,2,7,3,8,8,4};
        System.out.println(s.GetLeastNumbers_Solution(arr, 4));   //输出:[1, 2, 3, 4]
    }
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {

        ArrayList<Integer> list = new ArrayList<>();
        if (input.length <= 0 || k <= 0 || k > input.length) return list;

        sort(input, 0, input.length - 1);

        System.out.println(Arrays.toString(input));    //输出:[1, 2, 3, 4, 4, 5, 6, 7, 8, 8]

        for (int i = 0; i < k; i++)
            list.add(input[i]);

        return list;
    }
    private void sort(int[] arr, int low, int high)
    {
        int index;
        if ((high - low) > CUTOFF)
        {
            while (low < high)
            {
                index = partition(arr, low, high);
                sort(arr, low, index - 1);
                low = index + 1; //尾递归,采用迭代而不是递归的方式,缩减了堆栈深度,提高了整体性能
            }

        }
        else
            InsertSort(arr, low, high);
    }
    private int partition(int[] arr, int low, int high)
    {
        int flag = arr[low];
        while(low < high)
        {
            while (low < high && arr[high] >= flag)
                high--;
            arr[low]= arr[high];

            while(low < high && arr[low] <= flag)
                low++;
            arr[high] = arr[low];
        }
        arr[low]= flag;
        return low;
    }
    private void InsertSort(int[] arr, int low, int high) //直接插入排序
    {
        for (int i = low + 1; i <= high; i++)
        {
            if (arr[i] < arr[i - 1])
            {
                int save = arr[i];
                int j = i - 1;
                for (; j >= 0 && arr[j] > save; j--)
                    arr[j + 1] = arr[j];
                arr[j + 1] = save;
            }
        }
    }
}


import java.util.Arrays;

public class Solution {
    public static final int CUTOFF = 10;
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] arr = {4,5,1,6,2,7,3,8,8,4,2};
        s.quicksort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr)); //输出:[1, 2, 2, 3, 4, 4, 5, 6, 7, 8, 8]
    }
    private void quicksort(int[] arr, int low, int high)
    {
        if (low + CUTOFF <= high)
        {
            int m = (high + low) / 2;
            if (arr[m] < arr[low]) swap(arr, low, m);
            if (arr[high] < arr[low]) swap(arr, low, high);
            if (arr[high] < arr[m]) swap(arr, m, high); //此时,m端的值为中间值

            swap(arr, m, high - 1);
            int flag = arr[high - 1];

            int i = low;
            int j = high - 1;
            for ( ; ; )
            {
                while(arr[++i] < flag);
                while (arr[--j] > flag);
                if (i < j)
                    swap(arr, i, j);
                else
                    break;
            }
            swap(arr, i, high - 1);

            quicksort(arr, low, i - 1);
            quicksort(arr, i + 1, high);
        }
        else
            InsertSort(arr, low, high);
    }
    private void InsertSort(int[] arr, int low, int high) //直接插入排序
    {
        for (int i = low + 1; i <= high; i++)
        {
            if (arr[i] < arr[i - 1])
            {
                int save = arr[i];
                int j = i - 1;
                for (; j >= 0 && arr[j] > save; j--)
                    arr[j + 1] = arr[j];
                arr[j + 1] = save;
            }
        }
    }
    private void swap(int[] arr, int i, int j)
    {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

}




求k个最小的数: 点击打开链接





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

改进排序算法:快速排序(对冒泡排序的改进) 的相关文章

  • uva 120(排序,检索)

    题目 Stacks and Queues are often considered the bread and butter of data structures and find use in architecture parsing o
  • Python List 按照多个关键字排序

    最近刷刷题遇到的 发现还没有一模一样的答案 自己做个解答 以列表有两列为例 我们需要按照两列排序 可以利用sorted和lambda组合 l a 2 c 1 d 4 b 2 sorted l key lambda x x 1 x 0 rev
  • 几种排序算法比较

    前言 排序是按照关键字的非递减或非递增顺序对一组记录重新进行排列的操作 是对无规律的一组序列转化为递增或递减的操作 排序的稳定性 当排序记录中的关键字都部相同时 则任何一个记录的无序序列经过排序后得到的结果都唯一 反之 若存在两个或多个关键
  • JavaScript 实现数组中的字符串按长度排序,长度一样按字母顺序排序

    以下的newar数组里的val键值排序要求 字串按长度排序 长度一样按字母顺序排序 js实现数组中的字符串按长度排序 长度一样按字母顺序排序 function sortByLenByazAZVal array array sort a b
  • C++中sort函数详解

    原文链接点这 0 简介 sort函数用于C 中 对给定区间所有元素进行排序 默认为升序 也可进行降序排序 sort函数进行排序的时间复杂度为n log2n 比冒泡之类的排序算法效率要高 sort函数包含在头文件为 include的c 标准库
  • 基数排序-------C语言实现

    其他排序 堆排序 归并排序 插入排序和希尔排序 快速排序 冒泡排序和选择排序 基数排序 前备知识 注 我们知道 对于一个数如果我们想获取它得个位 只需对10取余 想获取十位的数 可以除10然后再对10取余 获取百位除100然后再对10取余
  • STL nth_element排序算法

    nth element 算法和 partial sort 不同 应用的范围由它的第一个和第三个参数指定 第二个参数是一个指向第 n 个元素的迭代器 如果这个范围内的元素是完全有序的 nth dement 的执行会导致第 n 个元素被放置在适
  • LeetCode 259. 3Sum Smaller(三数值和)

    原题网址 https leetcode com problems 3sum smaller Given an array of n integers nums and a target find the number of index tr
  • C语言--库函数qsort排序

    文章目录 一 C语言 库函数qsort排序 1 1 冒泡排序 1 2 qsort排序 二 模拟实现qsort函数 一 C语言 库函数qsort排序 假设我们要对一个数组元素进行排序 如果是一个整型数组 我们首先可以想到的是冒泡排序 但其实C
  • CH8-排序

    文章目录 1 基本概念和排序方法概述 1 1 排序方法的分类 1 2 存储结构 顺序表 2 插入排序 2 1 插入排序的种类 直接插入 折半插入 希尔排序 3 交换排序 3 1 冒泡排序 3 2 快速排序 4 选择排序 4 1 直接排序 4
  • 常用的前端排序

    冒泡排序 前一个与后一个作比较 如果前一个大于后一个 两者交换位置 对每一对相邻元素做第一步的操作 针对所有的元素重复以上的步骤 除了最后一个 let arr 1 3 4 5 8 6 4 1 3 2 for var i 0 i
  • Basic Level 1055 集体照 (25分)

    题目 拍集体照时队形很重要 这里对给定的 N 个人 K 排的队形设计排队规则如下 每排人数为 N K 向下取整 多出来的人全部站在最后一排 后排所有人的个子都不比前排任何人矮 每排中最高者站中间 中间位置为 m 2 1 其中 m 为该排人数
  • Vector的自动排序Sort

    建立了一个结构体 然后用容器进行存放 想对其进行排序 vector支持sort函数 但是需要自己指定排序函数 方法如下 1 需要包含头文件 include
  • mybatis 中 Example 的使用 :条件查询、排序、分页(三种分页方式 : RowBounds、PageHelpler 、limit )

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到教程 import tk mybatis mapper entity Example import com github pagehelper Pa
  • 王道快速排序和归并排序的完整代码

    这是快排的代码要作为模板背下来 include
  • 八大排序总结---- 数据结构 (图解法) 面试必会! ! !

    八大排序总结 目录 一 插入排序 InsertSort 二 希尔排序 ShellSort 三 选择排序 SelectSort 四 堆排序 HeapSort 五 冒泡排序 BubbleSort 六 快速排序 QuickSort 1 hoare
  • 力扣每日一题——三角形的最大周长

    题目链接 class Solution public int largestPerimeter vector
  • 【算法】直接插入排序C语言实现

    不知道大家喜不喜欢打扑克 哈哈 我就挺喜欢的 尤其是三人斗地主 很喜欢 现在我来描述一幅画面看看大家熟不熟悉 我抓牌的习惯是 在抓牌的时候 我要看着我的牌 看看牌的状况 有没有大小鬼 有几个2 有没有长的连 顺便做好基本的排序工作 比如我第
  • Redis基础数据结构——有序集合

    Redis基础数据结构 有序集合 redis的有序集合zset类似于Java的SoretedSet和HashMap的结合体 一方面它是一个set 可以保证内部value的唯一性 另一方面它可以给每个value赋予一个score 代表这个sc
  • Navicat导入Excel数据顺序变了

    项目场景 Navicat导入Excel数据 问题描述 从Excel表格中导入数据到数据库中 但是 在导入的过程中 我们常会发现数据顺序出现了问题 导致数据错位 给数据的处理带来了极大的麻烦 原因分析 这个问题的出现是由于数据库的默认排序规则

随机推荐

  • Java语音技术之FreeTTS

    转自 微点阅读 https www weidianyuedu com content 0017809736406 html Java语音技术之FreeTTS Java提供了语音API技术用于支持应用程序或Web页面中的人机语音交互 其核心技
  • Flash Download failed - “Cortex-M3“解决方法

    前几天在玩STM32F1的时候 烧录代码的时候出现这样一个错误 Error Flash Download failed Cortex M3 首先肯定要看配置问题 采用不同的仿真器 需要配置的选项就不同 这个完全可以自己看产品说明 当确定配置
  • vscode资源管理器隐藏配置文件的显示

    资源管理器显示太多 开头的文件 大多是配置文件 显示过多造成查看混乱 如何隐藏这些文件呢 左下角点击设置按钮中的设置 点击如图所示的按钮 在弹出的settings json 中添加如下内容并保存 files exclude true 注意
  • Nginx报错[emerg]: unknown directive “”

    前言 今天用记事本修改Nginx中的conf配置文件 由于自己没有备份 导致出问题 解决了两个小时都没有解决掉 不过遇到问题是好事 可以解决 如果有备份遇到问题也许不会一直去解决吧 但是 如果工作中的项目 由于自己的不备份 随意改动 影响项
  • 【C++入门】C/C++的(静态)断言用法总结

    1 C语言的断言 1 1 函数原型 include
  • linux0.11中的fork实现和一些注意事项

    最近几天刚开始在读代码 读的挺爽的 不过碰到了很多问题 慢慢来吧 有一个fork的系统调用一直没弄明白 查了一下再CSDN上有一篇好文 记录一 下 顺便自己添加一些自己的想法 下面是思路和提问 内核是linux0 11版本 里面的fork
  • Java刷新bean重新加载bean 上下文 刷新bean

    Autowired private ApplicationContext applicationContext 可以为接口或者业务方法被调用 public void reloadInstance 获取上下文 DefaultListableB
  • Transformer 训练优化

    前言 自 BERT 出现以来 NLP 领域已经进入了大模型的时代 大模型虽然效果好 但是毕竟不是人人都有着丰富的 GPU 资源 在训练时往往就捉襟见肘 出现显存 out of memory 的问题 或者训练时间非常非常的久 因此 这篇文章主
  • C语言深入学习--checklist6:函数、变量

    函数 1 如何查看函数在内存中的地址 打印该函数名的值就可以了 函数名是一个const的函数指针 2 如何给一个函数指针赋值 下面这个例子 函数指针的赋值和调用都有了 include
  • VNC远程连接(Win连Linux)

    VNC是主流Linux发行版内置的图形化远程工具之一 1 在Linux上启动VNC Server 执行vncserver命令 2 直接运行 vncviewer exe 系统会出现 Connection details 对话框 在 Conne
  • Mol Cell Proteomics.

    大家好 本周分享的是发表在MCP上的一篇关于鸟枪蛋白质组学中的错误率的文章 题目是Integrated identification and quantification error probabilities for shotgun pr
  • Android 仪表盘 图片 中心 旋转

    因为项目需求 需要做一个基于仪表盘方式的数据显示方式 在网上一会 google 一会 baidu 最后得来的也就是对 Matrix 的几个解释 之前还被 hdpi mdpi ldip 搞得晕头转向的 郁闷了许久 但是今天终于搞定了 心情愉悦
  • PID整定二:基于Ziegler-Nichols的频域响应

    PID整定二 基于Ziegler Nichols的频域响应 1参考 2连续Ziegler Nichols方法的PID整定 2 1整定方法 2 2仿真示例 1参考 1 1根轨迹图的绘制及分析 1 2计算机控制技术01 3 4离散系统的根轨迹分
  • 蓝桥杯python组算法模板与习题

    目录 一 一些简单的处理技巧和语法 1 小技巧 1 1 python中的快读 sys库 1 2 python程序测试时间 仅供参考实际比赛可能也没啥用 1 3 python中日期处理等问题小技巧 2 基础语法 2 1 首先就是标准格式化输入
  • Centos系统安装Tomcat(Tomcat7,Java8-jdk1.8)

    以前经常使用java8 也就是java jdk1 8 和tomcat7开发web系统 怀旧记录一下在centos7系统里安装部署tomcat7 同时部署多个tomcat7的方法 解决tomcat7在centos7系统启动很慢的问题 apac
  • OLED显示模块驱动原理及应用

    OLED显示模块驱动原理及应用 本文以中景园OLED显示模块为例 介绍模块的应用和OLED显示及驱动的基本原理 文中介绍了显示模块 SSD1306驱动芯片以及GT20L16S1Y字库芯片相关技术内容及原理 并加上了作者的理解和应用记录 一
  • 【计算机视觉

    文章目录 一 A Dataset of Multispectral Potato Plants Images 二 Active Terahertz 三 Apron Dataset 四 AquaTrash 五 BBBC041 P vivax
  • 电脑开机转圈圈不停-转圈后系统各窗口闪退-桌面黑屏解决探讨

    如题 如果在电脑出现开机黑屏 进入系统后仍系统闪退等问题后 那么可能是因为某些系统文件或网络相关的配置文件损坏或配置错误导致的 通过重置 Winsock 目录 可以恢复网络连接的正常运行 同时也可以修复与网络相关的系统问题 从而才能使电脑恢
  • (20200920)编程每日一题_C程序设计_计算整数段和

    1 描述 输出从整数A到整数B的所有整数以及这些数的和 来源 https pintia cn problem sets 14 problems 794 2 输入格式 输入在一行中给出2个整数A和B 其中 100 A B 100 其间以空格分
  • 改进排序算法:快速排序(对冒泡排序的改进)

    快速排序的基本思想 通过一趟排序将待排序记录分割成独立的两部分 其中一部分记录的关键字均比另一部分记录的关键字小 则可分别对这两部分记录继续进行排序 以达到整个序列有序的目的 Partition函数的作用 选取当中的一个关键字 将它放到一个