Ordenar marzo - v1.0

para ordenar

排序是将一组数据按照一定的规则进行排列的过程。在计算机科学中,排序是一
种常见的算法问题,通常用于对数据进行整理、查找、统计等操作。

Interpretación del Concepto

concepto basico

排序算法:排序算法是实现数据排序的具体方法。常见的排序算法包括冒泡排序、
 选择排序、插入排序、快速排序、归并排序、堆排序等。每个排序算法都有其特
 定的时间复杂度和空间复杂度,适用于不同规模和特点的数据集合。

排序稳定性:排序稳定性是指排序算法在排序过程中是否能够保持相等元素的相
 对顺序不变。稳定的排序算法可以确保相等元素的顺序不会发生变化,而不稳定
 的排序算法则无法保证。例如,对于序列[3a, 2, 3b, 1],如果排序算法是稳
 定的,那么排序后的结果应该是[1, 2, 3a, 3b],否则可能是[1, 2, 3b, 3a]

内部排序和外部排序:内部排序是指在内存中对数据进行排序,而外部排序是指
 在外部存储介质(如硬盘)上对数据进行排序。内部排序通常适用于数据规模
 较小的情况,可以直接将数据加载到内存中进行排序;而外部排序适用于数据
 规模较大的情况,需要借助外部存储介质进行分段排序。

排序的时间复杂度和空间复杂度:排序算法的时间复杂度是指排序算法执行所需
 的时间,通常以大O表示法表示。不同的排序算法具有不同的时间复杂度,从
 O(n^2)到O(nlogn)不等。排序算法的空间复杂度是指排序算法执行所需的额外
 空间,包括辅助数组、栈空间等。空间复杂度也是根据算法的特点而不同。

排序的稳定性和效率的权衡:在选择排序算法时,需要考虑排序的稳定性和效率
 之间的权衡。稳定的排序算法可以确保相等元素的相对顺序不变,但可能牺牲
 一定的效率;而不稳定的排序算法可能具有更高的效率,但无法保证相等元素
 的顺序。具体选择哪种排序算法取决于具体的应用场景和需求。

Clasificación

clasificación interna y clasificación externa

 内部排序:所有待排序的数据可以一次性加载到内存中进行排序,常见的内部
  排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序等。
 外部排序:待排序的数据量太大,无法一次性加载到内存中进行排序,需要利
  用外部存储进行排序,常见的外部排序算法有多路归并排序、败者树排序等。
Charla intensiva sobre clasificación interna
冒泡排序是一种简单的排序算法,它通过多次比较相邻的元素,并交换位置,从
 而将最大(或最小)的元素逐渐“冒泡”到正确的位置。

插入排序是一种通过构建有序序列,对未排序数据逐个进行插入的排序算法。在
 插入排序中,将第一个元素视为已排序序列,然后将后续元素依次插入到已排序
 序列的正确位置。

选择排序是一种简单直观的排序算法,它通过每次从未排序序列中选择最小(或
 最大)的元素,将其放置到已排序序列的末尾。

快速排序是一种高效的排序算法,它采用分治的策略,将问题分解为多个子问题,
 并通过递归的方式解决。快速排序的基本思想是选择一个基准元素,将序列分为
 两个子序列,其中一个子序列的元素都小于基准元素,另一个子序列的元素都大
 于基准元素,然后对子序列进行递归排序。

归并排序是一种稳定的排序算法,它采用分治的策略,将问题分解为多个子问题,
 并通过递归的方式解决。归并排序的基本思想是将序列分成两个子序列,分别进
 行排序,然后将两个已排序的子序列合并成一个有序序列。
Clasificación externa intensiva
多路归并排序的过程
1、将待排序的序列分成多个子序列,每个子序列都是有序的。

2、创建一个辅助数组,用于存储合并后的有序序列。

3、依次比较每个子序列的第一个元素,选择最小的元素放入辅助数组中,并将
 该元素所在子序列的指针后移一位。

4、重复步骤3,直到所有子序列都为空。

5、将辅助数组中的元素复制回原始序列。


败者树排序过程
1、初始化败者树:首先,我们需要创建一个败者树的数据结构。败者树是一棵完
 全二叉树,每个节点表示一个参与排序的数据源。在初始化时,所有节点的值都
 设置为正无穷大,表示初始状态下的败者。

2、建立初始归并段:接下来,我们从每个数据源中读取一个元素,构成初始的归
 并段。归并段是一个有序的数据序列,每个数据源对应一个归并段。

3、比较并选择胜者:对于每个归并段,我们需要比较归并段中的元素,并选择其
 中的胜者。胜者是指归并段中最小的元素。在比较过程中,我们将败者树中对应
 节点的值与归并段中的元素进行比较,如果归并段中的元素较小,则将其作为胜
 者,并将其索引保存在败者树的对应节点中。

4、重建败者树:在选择胜者后,我们需要根据新的胜者重新调整败者树。具体操
 作是将新的胜者与其父节点进行比较,如果新的胜者较小,则将其与父节点交换
 位置,并继续向上调整,直到达到根节点。

5、输出胜者:重复步骤3和步骤4,直到所有归并段中的元素都被选择为胜者。
 此时,败者树的根节点中保存的就是最小的元素。我们将该胜者输出,并从对应
 归并段中读取下一个元素,继续比较和选择胜者。

6、归并段更新:当一个归并段中的元素被输出后,我们需要从对应的数据源中读
 取一个新的元素来更新该归并段。如果数据源已经读取完毕,则将其对应节点的
 值设置为正无穷大,表示该数据源已经没有更多的元素可供选择。

7、重复步骤3到步骤6,直到所有数据源中的元素都被输出。

Clasificación por comparación y clasificación sin comparación

 比较排序:通过比较待排序元素之间的大小关系来进行排序,常见的比较排序
  算法有插入排序、选择排序、冒泡排序、快速排序、归并排序、堆排序等。
 非比较排序:不通过比较待排序元素之间的大小关系来进行排序,常见的非比
  较排序算法有计数排序、桶排序、基数排序等。

Ordenación estable y ordenación inestable

 稳定排序:如果待排序的序列中存在相等的元素,经过排序后,相等元素之间
  的相对顺序不发生变化,常见的稳定排序算法有插入排序、归并排序、冒泡排
  序等。
 不稳定排序:如果待排序的序列中存在相等的元素,经过排序后,相等元素之
  间的相对顺序可能发生变化,常见的不稳定排序算法有选择排序、快速排序、
  希尔排序、堆排序等。

Complejidad temporal del algoritmo de clasificación interna

 最好情况时间复杂度:表示待排序序列已经有序时的时间复杂度。
 最坏情况时间复杂度:表示待排序序列逆序时的时间复杂度。
 平均情况时间复杂度:表示待排序序列各种可能情况下的时间复杂度。

Clasificación recursiva y clasificación no recursiva

递归排序:通过递归的方式进行排序,如快速排序、归并排序等。
非递归排序:不使用递归的方式进行排序,如插入排序、选择排序、堆排序等。

Ordenamiento de burbuja

冒泡排序是一种简单的排序算法,它重复地走访过要排序的元素,依次比较相邻
 的两个元素,如果它们的顺序错误就交换它们,直到没有需要交换的元素,排序
 完成。

paso

1、从待排序的元素中选择第一个元素作为当前元素。
2、将当前元素与其后面的元素进行比较,如果当前元素大于后面的元素,则交换
  它们的位置,否则保持不变。
3、将当前元素移动到下一个位置,即将当前元素的索引加1。
4、重复步骤2和步骤3,直到当前元素移动到最后一个位置。
5、重复步骤1到步骤4,直到所有元素都被排序。

La idea central del tipo de burbuja

通过相邻元素的比较和交换来将最大的元素逐渐移动到最后的位置。每一轮排序
 都会将待排序序列中最大的元素移动到最后。

complejidad del tiempo

时间复杂度为O(n^2),其中n是待排序序列的长度。最好情况下,待排序序列已
 经是有序的,只需要进行一轮比较,时间复杂度为O(n)。最坏情况下,待排序
 序列是逆序的,需要进行n-1轮比较,时间复杂度为O(n^2)。

Código

public class BubbleSort {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = {
    
    5, 3, 8, 4, 2};
        bubbleSort(arr);
        System.out.println("排序结果:");
        for (int num : arr) {
    
    
            System.out.print(num + " ");
        }
    }

    public static void bubbleSort(int[] arr) {
    
    
        int n = arr.length;
        for (int i = 0; i < n - 1; i++) {
    
    
            for (int j = 0; j < n - i - 1; j++) {
    
    
                if (arr[j] > arr[j + 1]) {
    
    
                    // 交换arr[j]和arr[j+1]
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
}

clasificación de selección simple

简单排序,也称为冒泡排序和插入排序,是一种基本的排序算法。它的思想是通
 过多次比较和交换相邻的元素,将最大(或最小)的元素逐渐“冒泡”(或“插
 入”)到序列的一端,从而实现排序的目的。

Pasos específicos

以升序排序为例,简单排序的具体步骤如下

1遍历待排序的序列,从第一个元素开始。
2比较当前元素与下一个元素的大小。
3如果当前元素大于下一个元素,交换这两个元素的位置,使较大的元素“冒泡”到
 序列的末尾。
4继续比较下一个元素,重复步骤2和步骤3,直到遍历到序列的倒数第二个元素。
5重复步骤1至步骤4,直到所有元素都按照升序排列。

complejidad del tiempo

简单排序的时间复杂度为O(n^2),其中n为待排序序列的长度。这是因为在最坏
 情况下,需要进行n-1次遍历,每次遍历需要比较n-1次并进行相应的交换操作。
 因此,总的比较和交换次数为(n-1) + (n-2) + ... + 1 = n(n-1)/2,
 即O(n^2)。

Código

public class SelectionSort {
    
    
    public static void selectionSort(int[] arr) {
    
    
        int n = arr.length;

        for (int i = 0; i < n - 1; i++) {
    
    
            int minIndex = i;
            for (int j = i + 1; j < n; j++) {
    
    
                if (arr[j] < arr[minIndex]) {
    
    
                    minIndex = j;
                }
            }

            int temp = arr[minIndex];
            arr[minIndex] = arr[i];
            arr[i] = temp;
        }
    }

    public static void main(String[] args) {
    
    
        int[] arr = {
    
    64, 25, 12, 22, 11};

        selectionSort(arr);

        System.out.println("Sorted array:");
        for (int i = 0; i < arr.length; i++) {
    
    
            System.out.print(arr[i] + " ");
        }
    }
}

Guess you like

Origin blog.csdn.net/weixin_74888502/article/details/132034135