用JAVA实现十大经典排序算法的总结

数据结构-各种排序算法效率对比图 排序法 平均时间复杂度 最差情形 稳定度 额外空间 备注 冒泡排序 O(n2)  O(n2) 稳定 O(1) n小时较好 交换排序 O(n2)  O(n2) 不稳定 O(1) n小时较好 选择排序 O(n2) O(n2) 不稳定 O(1) n小时较好 插入排序 O(n2) O(n2) 稳定 O(1) 大部分已 阅读详情

本文转载于 Java建设者
术语说明
稳定:如果a原本在b前面,而a=b,排序之后
仍然在b的前面;

不稳定:如果a原本在b的前面,而a=b,排序
之后a可能会出现在b的后面;

内排序:所有排序操作都在内存中完成;

外排序:由于数据太大,因此把数据放在磁盘
中,而排序通过磁盘和内存的数据传输
才能进行;

时间复杂度: 一个算法执行所耗费的时间。

空间复杂度:运行完一个程序所需内存的大小。

在这里插入图片描述在这里插入图片描述在这里插入图片描述
比较和非比较的区别

常见的快速排序、归并排序、堆排序、冒泡排序等属于比较排序。在排序的最终结果里,元素之间的次序依赖于它们之间的比较。每个数都必须和其他数进行比较,才能确定自己的位置。
在冒泡排序之类的排序中,问题规模为n,又因为需要比较n次,所以平均时间复杂度为O(n²)。在归并排序、快速排序之类的排序中,问题规模通过分治法消减为logN次,所以时间复杂度平均O(nlogn)。
比较排序的优势是,适用于各种规模的数据,也不在乎数据的分布,都能进行排序。可以说,比较排序适用于一切需要排序的情况。

计数排序、基数排序、桶排序则属于非比较排序。非比较排序是通过确定每个元素之前,应该有多少个元素来排序。针对数组arr,计算arr[i]之前有多少个元素,则唯一确定了arr[i]在排序后数组中的位置。
非比较排序只要确定每个元素之前的已有的元素个数即可,所有一次遍历即可解决。算法时间复杂度O(n)。
非比较排序时间复杂度底,但由于非比较排序需要占用空间来确定唯一位置。所以对数据规模和数据分布有一定的要求。

1、冒泡排序(Bubble Sort)

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢浮到数列的顶端。

1.1 算法描述

比较相邻的元素。如果第一个比第二个大,就交换它们两个;
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
针对所有的元素重复以上的步骤,除了最后一个;
重复步骤1~3,直到排序完成。
1.2 动图演示

在这里插入图片描述
1.3 代码实现

public static int[] bubbleSort(int[] array) {
  if (array.length == 0)
    return array;
  for (int i = 0; i < array.length; i++)
    for (int j = 0; j < array.length - 1 - i; j++)
      if (array[j + 1] < array[j]) {
        int temp = array[j + 1];
        array[j + 1] = array[j];
        array[j] = temp;
      }
  return array;
}

1.4 算法分析

最佳情况:T(n) = O(n) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2)

2、选择排序(Selection Sort)

表现最稳定的排序算法之一,因为无论什么数据进去都是 O(n2) 的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。理论上讲,选择排序可能也是平时排序一般人想到的最多的排序方法了吧。

选择排序(Selection-sort) 是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

2.1 算法描述

n 个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:

初始状态:无序区为R[1…n],有序区为空;
第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
n-1趟结束,数组有序化了。
在这里插入图片描述

public static int[] selectionSort(int[] array) {
  if (array.length == 0)
    return array;
  for (int i = 0; i < array.length; i++) {
    int minIndex = i;
    for (int j = i; j < array.length; j++) {
      if (array[j] < array[minIndex]) //找到最小的数
        minIndex = j; //将最小数的索引保存
    }
    int temp = array[minIndex];
    array[minIndex] = array[i];
    array[i] = temp;
  }
  return array;
}

2.4 算法分析
最佳情况:T(n) = O(n2) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2)

3、插入排序(Insertion Sort)

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用 in-place 排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

3.1 算法描述

一般来说,插入排序都采用 in-place 在数组上实现。具体算法描述如下:

从第一个元素开始,该元素可以认为已经被排序;
取出下一个元素,在已经排序的元素序列中从后向前扫描;
如果该元素(已排序)大于新元素,将该元素移到下一位置;
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
将新元素插入到该位置后;
重复步骤2~5。
在这里插入图片描述
3.2 代码实现

public static int[] insertionSort(int[] array) {
  if (array.length == 0)
    return array;
  int current;
  for (int i = 0; i < array.length - 1; i++) {
    current = array[i + 1];
    int preIndex = i;
    while (preIndex >= 0 && current < array[preIndex]) {
      array[preIndex + 1] = array[preIndex];
      preIndex--;
    }
    array[preIndex + 1] = current;
  }
  return array;
}

3.4 算法分析

最佳情况:T(n) = O(n) 最坏情况:T(n) = O(n2) 平均情况:T(n) = O(n2)

4、希尔排序(Shell Sort)

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破 O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。

希尔排序是把记录按下表的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

4.1 算法描述

我们来看下希尔排序的基本步骤,在此我们选择增量 gap=length/2,缩小增量继续以 gap = gap/2 的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2…1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。此处我们做示例使用希尔增量。

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:

选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
按增量序列个数 k,对序列进行 k 趟排序;
每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
4.2 过程演示

在这里插入图片描述
4.3 代码实现

public static int[] ShellSort(int[] array) {
  int len = array.length;
  int temp, gap = len / 2;
  while (gap > 0) {
    for (int i = gap; i < len; i++) {
      temp = array[i];
      int preIndex = i - gap;
      while (preIndex >= 0 && array[preIndex] > temp) {
        array[preIndex + gap] = array[preIndex];
        preIndex -= gap;
      }
      array[preIndex + gap] = temp;
    }
    gap /= 2;
  }
  return array;
}

4.4 算法分析
最佳情况:T(n) = O(nlog2 n) 最坏情况:T(n) = O(nlog2 n) 平均情况:T(n) =O(nlog2n)

5、归并排序(Merge Sort)

和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(n log n)的时间复杂度。代价是需要额外的内存空间。

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

5.1 算法描述

把长度为n的输入序列分成两个长度为n/2的子序列;
对这两个子序列分别采用归并排序;
将两个排序好的子序列合并成一个最终的排序序列。
5.2 动图演示
在这里插入图片描述
如果太快的话可以看百度的介绍,百度的介绍还是比较全面的
https://baike.sogou.com/v8340582.html
5.3 代码实现

public static int[] MergeSort(int[] array) {
  if (array.length < 2) return array;
  int mid = array.length / 2;
  int[] left = Arrays.copyOfRange(array, 0, mid);
  int[] right = Arrays.copyOfRange(array, mid, array.length);
  return merge(MergeSort(left), MergeSort(right));
}
/**
     * 归并排序——将两段排序好的数组结合成一个排序数组
     *
     * @param left
     * @param right
     * @return
     */
public static int[] merge(int[] left, int[] right) {
  int[] result = new int[left.length + right.length];
  for (int index = 0, i = 0, j = 0; index < result.length; index++) {
    if (i >= left.length)
      result[index] = right[j++];
    else if (j >= right.length)
      result[index] = left[i++];
    else if (left[i] > right[j])
      result[index] = right[j++];
    else
      result[index] = left[i++];
  }
  return result;
}
  1. 4 算法分析

最佳情况:T(n) = O(n) 最差情况:T(n) = O(nlogn) 平均情况:T(n) = O(nlogn)

6、快速排序(Quick Sort)

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

6.1 算法描述

快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

从数列中挑出一个元素,称为 基准(pivot);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
6.2 动图演示
在这里插入图片描述
由于快速排序这个动图是真的很快速,所以需要放慢看一下
在这里插入图片描述
这是一轮排序,然后调用递归再分别从每一小组里边去排序,最后得到的就是一个有序的数组。

6.3 代码实现

public static int[] QuickSort(int[] array, int start, int end) {
  if (array.length < 1 || start < 0 || end >= array.length || start > end) return null;
  int smallIndex = partition(array, start, end);
  if (smallIndex > start)
    QuickSort(array, start, smallIndex - 1);
  if (smallIndex < end)
    QuickSort(array, smallIndex + 1, end);
  return array;
}
/**
     * 快速排序算法——partition
     */
public static int partition(int[] array, int start, int end) {
  int pivot = (int) (start + Math.random() * (end - start + 1));
  int smallIndex = start - 1;
  swap(array, pivot, end);
  for (int i = start; i <= end; i++)
    if (array[i] <= array[end]) {
      smallIndex++;
      if (i > smallIndex)
        swap(array, i, smallIndex);
    }
  return smallIndex;
}

/**
     * 交换数组内两个元素
     */
public static void swap(int[] array, int i, int j) {
  int temp = array[i];
  array[i] = array[j];
  array[j] = temp;
}

6.4 算法分析

最佳情况:T(n) = O(nlogn) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(nlogn)

7、堆排序(Heap Sort)

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

7.1 算法描述

将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;
将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。
7.2 动图演示
在这里插入图片描述
堆排序静态图的实现
7.3 代码实现

static int len;
/**
     * 堆排序算法
     *
     * @param array
     * @return
     */
public static int[] HeapSort(int[] array) {
  len = array.length;
  if (len < 1) return array;
  //1.构建一个最大堆
  buildMaxHeap(array);
  //2.循环将堆首位(最大值)与末位交换,然后在重新调整最大堆
  while (len > 0) {
    swap(array, 0, len - 1);
    len--;
    adjustHeap(array, 0);
  }
  return array;
}
/**
     * 建立最大堆
     *
     * @param array
     */
public static void buildMaxHeap(int[] array) {
  //从最后一个非叶子节点开始向上构造最大堆
  for (int i = (len/2 - 1); i >= 0; i--) { //感谢 @让我发会呆 网友的提醒,此处应该为 i = (len/2 - 1) 
    adjustHeap(array, i);
  }
}
/**
     * 调整使之成为最大堆
     *
     * @param array
     * @param i
     */
public static void adjustHeap(int[] array, int i) {
  int maxIndex = i;
  //如果有左子树,且左子树大于父节点,则将最大指针指向左子树
  if (i * 2 < len && array[i * 2] > array[maxIndex])
    maxIndex = i * 2;
  //如果有右子树,且右子树大于父节点,则将最大指针指向右子树
  if (i * 2 + 1 < len && array[i * 2 + 1] > array[maxIndex])
    maxIndex = i * 2 + 1;
  //如果父节点不是最大值,则将父节点与最大值交换,并且递归调整与父节点交换的位置。
  if (maxIndex != i) {
    swap(array, maxIndex, i);
    adjustHeap(array, maxIndex);
  }
}

7.4 算法分析

最佳情况:T(n) = O(nlogn) 最差情况:T(n) = O(nlogn) 平均情况:T(n) = O(nlogn

8、计数排序(Counting Sort)

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。

8.1 算法描述

找出待排序的数组中最大和最小的元素;
统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。
8.2 动图演示
在这里插入图片描述
8.3 代码实现

public static int[] CountingSort(int[] array) {
  if (array.length == 0) return array;
  int bias, min = array[0], max = array[0];
  for (int i = 1; i < array.length; i++) {
    if (array[i] > max)
      max = array[i];
    if (array[i] < min)
      min = array[i];
  }
  bias = 0 - min;
  int[] bucket = new int[max - min + 1];
  Arrays.fill(bucket, 0);
  for (int i = 0; i < array.length; i++) {
    bucket[array[i] + bias]++;
  }
  int index = 0, i = 0;
  while (index < array.length) {
    if (bucket[i] != 0) {
      array[index] = i - bias;
      bucket[i]--;
      index++;
    } else
      i++;
  }
  return array;
}

8.4 算法分析

当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 O(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。

最佳情况:T(n) = O(n+k) 最差情况:T(n) = O(n+k) 平均情况:T(n) = O(n+k)

9、桶排序(Bucket Sort)

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。

桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排

9.1 算法描述

人为设置一个BucketSize,作为每个桶所能放置多少个不同数值(例如当BucketSize==5时,该桶可以存放{1,2,3,4,5}这几种数字,但是容量不限,即可以存放100个3);
遍历输入数据,并且把数据一个一个放到对应的桶里去;
对每个不是空的桶进行排序,可以使用其它排序方法,也可以递归使用桶排序;
从不是空的桶里把排好序的数据拼接起来。
注意,如果递归使用桶排序为各个桶排序,则当桶数量为1时要手动减小 BucketSize 增加下一循环桶的数量,否则会陷入死循环,导致内存溢出。

9.2 图片演示
在这里插入图片描述
9.3 代码实现

public static ArrayList<Integer> BucketSort(ArrayList<Integer> array, int bucketSize) {
  if (array == null || array.size() < 2)
    return array;
  int max = array.get(0), min = array.get(0);
  // 找到最大值最小值
  for (int i = 0; i < array.size(); i++) {
    if (array.get(i) > max)
      max = array.get(i);
    if (array.get(i) < min)
      min = array.get(i);
  }
  int bucketCount = (max - min) / bucketSize + 1;
  ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketCount);
  ArrayList<Integer> resultArr = new ArrayList<>();
  for (int i = 0; i < bucketCount; i++) {
    bucketArr.add(new ArrayList<Integer>());
  }
  for (int i = 0; i < array.size(); i++) {
    bucketArr.get((array.get(i) - min) / bucketSize).add(array.get(i));
  }
  for (int i = 0; i < bucketCount; i++) {
    if (bucketSize == 1) { // 如果带排序数组中有重复数字时  感谢 @见风任然是风 朋友指出错误
      for (int j = 0; j < bucketArr.get(i).size(); j++)
        resultArr.add(bucketArr.get(i).get(j));
    } else {
      if (bucketCount == 1)
        bucketSize--;
      ArrayList<Integer> temp = BucketSort(bucketArr.get(i), bucketSize);
      for (int j = 0; j < temp.size(); j++)
        resultArr.add(temp.get(j));
    }
  }
  return resultArr;
}

9.4 算法分析

桶排序最好情况下使用线性时间 O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为 O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。

最佳情况:T(n) = O(n+k) 最差情况:T(n) = O(n+k) 平均情况:T(n) = O(n2)

10、基数排序(Radix Sort)

基数排序也是非比较的排序算法,对每一位进行排序,从最低位开始排序,复杂度为O(kn),为数组长度,k为数组中的数的最大的位数;

基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。

10.1 算法描述

取得数组中的最大数,并取得位数;
arr为原始数组,从最低位开始取每个位组成radix数组;
对radix进行计数排序(利用计数排序适用于小范围数的特点);
10.2 动图演示
在这里插入图片描述
10.2 动图演示

public static int[] RadixSort(int[] array) {
  if (array == null || array.length < 2)
    return array;
  // 1.先算出最大数的位数;
  int max = array[0];
  for (int i = 1; i < array.length; i++) {
    max = Math.max(max, array[i]);
  }
  int maxDigit = 0;
  while (max != 0) {
    max /= 10;
    maxDigit++;
  }
  int mod = 10, div = 1;
  ArrayList<ArrayList<Integer>> bucketList = new ArrayList<ArrayList<Integer>>();
  for (int i = 0; i < 10; i++)
    bucketList.add(new ArrayList<Integer>());
  for (int i = 0; i < maxDigit; i++, mod *= 10, div *= 10) {
    for (int j = 0; j < array.length; j++) {
      int num = (array[j] % mod) / div;
      bucketList.get(num).add(array[j]);
    }
    int index = 0;
    for (int j = 0; j < bucketList.size(); j++) {
      for (int k = 0; k < bucketList.get(j).size(); k++)
        array[index++] = bucketList.get(j).get(k);
      bucketList.get(j).clear();
    }
  }
  return array;
}

10.4 算法分析

最佳情况:T(n) = O(n * k) 最差情况:T(n) = O(n * k) 平均情况:T(n) = O(n * k)

基数排序有两种方法:

MSD 从高位开始进行排序 LSD 从低位开始进行排序

基数排序 vs 计数排序 vs 桶排序

这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:

基数排序:根据键值的每位数字来分配桶
计数排序:每个桶只存储单一键值
桶排序:每个桶存储一定范围的数值
最后在送上一个可以可视化观看数据结构的一个网站
https://visualgo.net/en

十大经典排序算法(java实现、配图解,附源码) Python微信订餐小程序课程视频 https://edu.youkuaiyun.com/course/detail/36074 Python实战量化交易理财系统 https://edu.youkuaiyun.com/course/detail/35475 前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记。 内容主要是关于十大经典排序算法的简介、原理、动静态图解和源码实现的分析。 对于一名程序员来讲,我们都知道数据结构与算法起初是用 阅读详情

相关推荐

十大经典排序算法Java实现(代码详细注释)

1.冒泡排序 2.选择排序 3.插入排序 4.快速排序 5…希尔排序 6.计数排序 7.归并排序 8. 基数排序 9.堆排序 10.桶排序

致虚极POLE守静笃 3104

详解Java常用排序算法(10种,含演示动画)

Java常用的排序算法有以下几种: 1. 冒泡排序;2. 选择排序;3. 插入排序;4. 希尔排序;5. 归并排序;6. 快速排序;7. 堆排序;8. 计数排序;9. 桶排序;10. 基数排序。 这些排序算法都有各自的优缺点,应根据具体情况选择适合的算法。

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 3万+

十大经典排序算法的java实现及详细讲解

排序算法平均时间复杂度空间复杂度稳定性适用场景冒泡排序O(n²)O(1)稳定小规模数据或基本有序选择排序O(n²)O(1)不稳定简单实现,数据量小插入排序O(n²)O(1)稳定小规模或基本有序希尔排序O(n log n)O(1)不稳定中等规模数据归并排序O(n log n)O(n)稳定大规模数据,需要稳定排序快速排序O(n log n)O(log n)不稳定大规模数据,通用排序堆排序O(n log n)O(1)不稳定。

zhlhappy的博客 1085

8大Java排序方法(由简入繁),有代码详解和原理指导

Java8大排序方法

Byyyi耀的博客 4724

标准高斯过程回归(Gaussian Processes Regression, GPR)从零开始,公式推导

标准高斯过程回归从零开始公式推导

qq_43587949的博客 1万+

从零到一:基于Docker与Gewechat协议,打造高可用微信AI助手

本文提供了一份从零开始的实战指南,详细讲解如何利用Docker容器化技术与Gewechat协议,构建一个高可用、低风险的微信AI助手。通过整合Dify AI平台,您可以为微信机器人注入大语言模型的智能,实现自动问答、知识库查询等高级功能,显著提升个人或团队在微信场景下的沟通与信息处理效率。

weixin_29280657的博客 160

JAVA七种常见排序算法

本文介绍了Java中常用的排序算法,包括冒泡、选择、插入、快速、归并、堆、基数排序。每算法附有示例,帮助理解其工作原理和性能,为正确选择排序算法提供了指导。

weixin_45934981的博客 2869

从零开始:DJI-F450无人机硬件组装全流程解析

本文详细解析了DJI-F450无人机的硬件组装全流程,从开箱清点到焊接、机械组装、飞控系统搭建、电路整合及调试试飞。重点介绍了电调焊接、机臂安装、飞控校准等关键步骤的实用技巧和常见问题解决方案,帮助无人机爱好者从零开始完成专业级组装。

weixin_29210759的博客 619

十大经典排序算法——java语言

一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、归并排序 六、快速排序 七、堆排序 八、计数排序 九、桶排序 十、基数排序

weixin_56781779的博客 7037

Jetson AGX Orin平台Jetpack5升级Jetpack6,自研载板USB不工作问题调试

1. 问题描述将AGX Orin工业的新板放到定制的载板上当在ubuntu 22和Jetpack 6.1上使用SDKManager刷机时,lsusb为空,并且在引导时没有发现/注册xusb设备。USB C端口正常打开并供电,但似乎没有数据传输。在Ubuntu 18 Jetpack 5.1.4 SDKManager上同样刷机之后,usb C集线器在引导时被正确地发现,显示在lsusb中,并识别/挂载外部驱动器。

jzwjzw19900922的博客 1509

ESP32-CAM 赋能 AI 视觉巡检小车:自主避障与目标追踪实现全解析

本文基于 ESP32-CAM 实现了低成本 AI 视觉巡检小车的核心功能,硬件成本<100 元,兼顾自主避障与目标追踪。算法升级:移植 YOLOv5nano 量化模型(INT8),提升目标检测精度(如识别巡检场景中的 “异常物体”“人员”);无线拓展:通过 MQTT 协议将巡检图像、距离数据上传到阿里云 / 腾讯云,实现远程监控;多传感器融合:增加温湿度(DHT11)、红外测温(MLX90614)模块,扩展巡检维度;路径规划:结合 SLAM 算法,实现自主建图与路径巡检。

weixin_42300449的博客 367

JAVA代码实现十大经典排序算法

n: 数据规模k: “桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存。

桃李不言下自成蹊 3万+

化工模拟与优化软件:Aspen HYSYS二次开发_(15).工业应用与项目管理

项目背景、目标和主要流程。

kkchenjj的博客 1130

Java实现十大经典排序算法详解

排序算法平均时间复杂度最好情况最坏情况空间复杂度稳定性冒泡排序O(n²)O(n)O(n²)O(1)稳定选择排序O(n²)O(n²)O(n²)O(1)不稳定插入排序O(n²)O(n)O(n²)O(1)稳定希尔排序O(n log n)O(n log²n)O(n²)O(1)不稳定归并排序O(n log n)O(n log n)O(n log n)O(n)稳定快速排序O(n log n)O(n log n)O(n²)O(log n)

weixin_43063624的博客 2785

SAP Integration Suite 与 SAP Cloud Integration 的关系解析

SAP Cloud Integration是SAP Integration Suite套件的核心组件,专注于消息与流程集成。两者关系可概括为:Integration Suite是SAP BTP上的集成平台套件(iPaaS),而Cloud Integration是其中负责应用与B2B集成的关键能力。日常所说的"CPI"实际指代的是Integration Suite中的Cloud Integration功能。该套件还包含API管理、事件网格等其他集成能力,共同构成企业集成解决方案。理解这一层

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 592

LLM制造业最佳实践:基于大语言模型处理最优化问题,制造业如何更优排产,提升资源利用率

随着制造业数字化转型加速,生产排产优化成为提升企业效率和竞争力的关键环节。大语言模型(LLM)凭借其强大的多模态数据处理、动态优化和智能推理能力,在复杂排产场景中展现出独特优势。谷歌、DeepSeek等机构的研究表明,LLM可通过自然语言交互和生成式决策,突破传统优化算法的局限性。本报告结合半导体行业实践案例与技术路径,系统分析LLM在排产优化中的应用潜力与挑战。

shiter编写程序的艺术 939

十大经典排序算法的java实现以及原理讲解

首先,这篇博客的来源是因为我在学习排序算法的时候,看到了一位大神写的十大经典排序算法,写的真的很不错,可是遗憾的是没有java版本实现,所以我按照每个排序来写了一个java版本实现,如有错误,欢迎指正。 所以说,学习这篇文章时,建议和十大经典排序算法一起看。 1、冒泡排序 package cn.yqh.interview.sort; /** * @author 袁 * @cre...

yuan_qh的博客 2150

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

十大经典排序算法(java实现)

基于java的十大经典排序算法 这篇文章没有出现排序算法的可视化,推荐一个可视化排序算法的网站--------> 美国旧金山大学计算机科学 里边给出了很详细的过程 1.冒泡排序 package 十大经典排序算法; import com.dc.Util; public class _01BubbleSort { public static void main(String[] args...

qq_41821556的博客 687

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

十大经典排序算法(Java实现)

内部排序:数据记录在内存中进行排序外部排序:因数据量过大,不能一次容纳全部的排序记录,在排序过程中需要访问外存名词解释:n:数据规模k:“桶” 的个数In-place:占用常数内存,不占用额外内存Out-place:占用额外内存术语说明:稳定:如果 A 原本在 B 前面,而 A=B,排序之后 A 仍然在 B 的前面。不稳定:如果 A 原本在 B 的前面,而 A=B,排序之后 A 可能会出现在 B 的后面。内排序:所有排序操作都在内存中完成。外排序。

qq_54103767的博客 363

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

十大经典排序算法详细总结(含JAVA代码实现)

文章目录十大经典排序算法详细总结(含JAVA代码实现)0、排序算法说明1、冒泡排序(Bubble Sort)2、选择排序(Selection Sort)3、插入排序(Insertion Sort)4、希尔排序(Shell Sort)5、归并排序(Merge Sort)6、快速排序(Quick Sort)7、堆排序(Heap Sort)8、计数排序(Counting Sort)9、桶排序(Bucke...

Java学习之道 4万+

十大经典排序算法最强总结(含JAVA代码实现)

十大经典排序算法最强总结(含JAVA代码实现) 最近几天在研究排序算法,看了很多博客,发现网上有的文章中对排序算法解释的并不是很透彻,而且有很多代码都是错误的,例如有的文章中在“桶排序”算法中对每个桶进行排序直接使用了Collection.sort()函数,这样虽然能达到效果,但对于算法研究来讲是不可以的。所以我根据这几天看的文...

A点点圈圈A的博客 433

java实现十大经典排序算法【GIF动画+完整代码+详细注释】

java实现十大经典排序算法,gif动画,完整代码,详细注释。通过本文的学习,相信你不仅能够深入了解排序算法的原理和实现,还能通过直观的动图更好地理解其工作过程。这些算法是每个程序员必备的工具,无论是在学术研究还是工业应用中都有着广泛的应用。掌握它们,将会大大提升你的算法思维能力。程序员三毛归并排序gif桶排序gif计数排序gif。

weixin_38522648的博客 1480

十大经典排序算法总结(Java实现+动画)

最近在梳理《数据结构与算法》的内容,在网上看了几篇不错的文章,现在根据自己的理解重新整理一下十大经典排序算法。实际生产中,最好的算法一定是结合数据集本身的特点(大小,长度,是否已经基本有序等等)来选择的,不要拘泥于算法本身。 我参考的文章有:https://www.cnblogs.com/guoyaohua/p/8600214.html,https://blog.youkuaiyun.com/liang_g...

meibenxiang的博客 5万+
上一篇: SQL进阶技巧
下一篇: 关于堆的介绍
凌晨里的无聊人
博客等级 码龄8年 2320粉丝 206原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值