首页 > 其他分享 >排序

排序

时间:2023-12-15 15:23:54浏览次数:25  
标签:arr int 元素 gap 序列 排序

1.从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,这种排序方法称为( 插入排序)。

插入排序基本思想:每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止。

插入排序的代码实现:

void StraightSort(int *arr,int len){
    int tmp; // 用于暂存当前元素的值
    int i; // 外层循环计数器
    int j; // 内层循环计数器

    for (i = 1; i < len; i++){ // 遍历数组,从第二个元素开始
        tmp = arr[i]; // 将当前元素的值暂存到tmp变量中
        for (j = i - 1; j >= 0 && arr[j] > tmp; j--){ // 内层循环用于将当前元素插入到已排序的序列中的正确位置
            arr[j + 1] = arr[j]; // 如果前一个元素比当前元素大,则将前一个元素后移一位
        }
        arr[j + 1] = tmp; // 将当前元素插入到正确位置
    }
}

 

希尔排序(shell排序)基本思想:希尔排序是把序列按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量的逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰好被分为一组,算法便终止。

希尔排序需要定义一个增量,这里选择增量为gap=length/2,缩小增量以gap=gap/2的方式,这个增量可以用一个序列来表示,{n/2,(n/2)/2....1},称为增量序列,这个增量是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。

希尔排序代码如下:

// Shell排序算法,对数组arr进行排序,数组长度为len
void ShellSort(int *arr, int len) {
    // 使用希尔增量进行分组
    for (int gap = len/2; gap > 0; gap = gap/2) {
        // 对每个分组进行插入排序
        for (int i = gap; i < len; i++) {
            int j = i;
            // 插入排序
            while (j - gap >= 0 && arr[j] < arr[j - gap]) {
                Swap(arr, j, j - gap); // 调用Swap函数交换元素
                j = j - gap;
            }
        }
    }
}

归并排序基本思想:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

void merge_sort(int q[], int l, int r)
{
    //递归的终止情况
    if(l >= r) return;

    //第一步:分成子问题
    int mid = l + r >> 1;

    //第二步:递归处理子问题
    merge_sort(q, l, mid ), merge_sort(q, mid + 1, r);

    //第三步:合并子问题
    int k = 0, i = l, j = mid + 1, tmp[r - l + 1];
    while(i <= mid && j <= r)
        if(q[i] <= q[j]) tmp[k++] = q[i++];
        else tmp[k++] = q[j++];
    while(i <= mid) tmp[k++] = q[i++];
    while(j <= r) tmp[k++] = q[j++];

    for(k = 0, i = l; i <= r; k++, i++) q[i] = tmp[k];
}

 

冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继续这个过程,直到所有数据元素都排好序。

算法的核心在于每次通过两两比较交换位置,选出剩余无序序列里最大(小)的数据元素放到队尾。

冒泡排序的代码:

void bubble_sort(int arr[], int len) {
    int i, j;
    for (i = 0; i < len - 1; i++)
        for (j = 0; j < len - 1 - i; j++)
            if (arr[j] > arr[j + 1])
                swap(arr[j], arr[j + 1]);
}

选择排序的思想:利用线性查找搜索出待排序列中的最小元素,并将它移动到最前面,每完成一次遍历,都会使一个元素在正确位置,即第i趟排序后,前面i个元素在正确位置。

选择排序的代码:

// 选择排序
    // 每次找到一个最小的 放在正确的位置
    public void selectsort(int[] a) {
        int k = 0;
        int temp = 0;
        for (int i = 0; i < a.length - 1; i++) {//i控制每趟循环,从第一个元素开始
            k = i;//第i趟,k取出第i个数据与后边的数据进行比较(假设k此时为最小元素)
            for (int j = i; j < a.length; j++) {//内层循环用于找出最小元素
                if (a[j] < a[k]) {
                    k = j;//k用来记录最小元素的下标

                }
            }

            temp = a[i];
            a[i] = a[k];
            a[k] = temp;//将最小数据与待排序列的第一个元素交换

        }
        for (int num : a) {
            System.out.print(num + " ");
        }
    }

 

快速排序属于分治算法,分治算法都有三步:分成子问题  递归处理子问题  子问题合并

快速排序的代码:

void quick_sort(int q[], int l, int r)
{
    //递归的终止情况
    if(l >= r) return;

    //第一步:分成子问题
    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while(i < j)
    {
        do i++; while(q[i] < x);
        do j--; while(q[j] > x);
        if(i < j) swap(q[i], q[j]);
    }

    //第二步:递归处理子问题
    quick_sort(q, l, j), quick_sort(q, j + 1, r);

    //第三步:子问题合并.快排这一步不需要操作,但归并排序的核心在这一步骤
}

 

 

标签:arr,int,元素,gap,序列,排序
From: https://www.cnblogs.com/aixin52129211/p/17903428.html

相关文章

  • java之冒泡排序
    冒泡排序原理:从第一个数开始,和后面一个数比较大小,根据升序或者降序,看是否需要互换位置。每一轮会把1个数罗列到正确位置,经过数组长度-1轮比较,排序完成。比如:对数组{11,55,33,22,44}进行升序排列数组长度是5,需要经过5-1轮,每一轮需要比较5-当前轮次。publicc......
  • Java-常见的排序算法有哪些
    Java-常见的排序算法有哪些比较排序算法:冒泡排序(BubbleSort):过程:从左到右依次比较相邻的元素,如果顺序不对就交换它们,一轮比较会将最大的元素冒泡到末尾。优势:简单易懂,对于小型数据集表现较好。劣势:时间复杂度为O(n^2),性能相对较差。插入排序(InsertionSort):过......
  • Mysql Order 排序的时候占用很长时间解决思路
    MySQL中的连表查询(JOIN)在进行ORDERBY排序时可能会变得很慢,尤其是当处理大量数据时。以下是一些优化策略,可以帮助减少排序操作的时间:索引优化:确保参与排序的列上有索引。如果排序的列是从JOIN的表中来的,那么在这些列上创建索引可能会提高性能。如果可能,尝试将索引的顺序与ORD......
  • 算法学习笔记二一冒泡排序
    目录什么是冒泡排序算法原理代码示例什么是冒泡排序​对给定数组进行遍历,每次比较相邻两个元素大小,若大的数值在前面则交换两数位置(升序),每完成一趟遍历数组中最大的元素都会上升到数组的末尾,这也是冒泡一词的由来。算法原理(升序)列表每相邻的数,如果前面比后面大,则交换这两个数......
  • 【删除排序链表中的重复元素】模拟
    leetcode82.删除排序链表中的重复元素II题意:只要链表中元素x重复出现了,删除所有元素x(刚开始还读错题了……)题解:在表头前添加链表的虚拟节点dummy遍历链表(1)如果当前节点cur的下一个节点cur.next和cur.next.next相等,则意味着出现了重复元素,记录元素值,从cur.next开始挨个删......
  • 常见排序算法
    排序常见的简单排序算法I.选择排序选择排序思路:选择出数组中的最小元素,将它与数组的第一个元素交换位置。再从剩下的元素中选择出最小的元素,将它与数组的第二个元素交换位置。不断进行这样的操作,直到将整个数组排序。publicvoidsort(int[]arr){intN=arr.length;......
  • 算法Day2双指针法排序,滑动窗口,螺旋矩阵
    Day2双指针法排序,滑动窗口,螺旋矩阵ByHQWQF2023/12/14笔记977.有序数组的平方https://leetcode.cn/problems/squares-of-a-sorted-array/返回一个非递减顺序排序的整数数组每个元素的平方后组成的新数组,新数组也按非递减顺序排序。解法:双指针法由于给定数组本身是有序的,......
  • 【合并排序链表】分治/优先队列
    合并两个排序链表模拟维护一个合并链表,每次添加两个排序链表中较小val的节点即可模拟代码publicListNodemergeTwo(ListNodea,ListNodeb){if(a==null)returnb;if(b==null)returna;ListNodeans=newListNode(0);Lis......
  • 冒泡排序
    比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个,即需要进行length-1次。第一次是对n个数进行n-1次比较,进行到最后第n个的一......
  • 拓扑排序软件设计——ToplogicalSort_app(含有源码、需求分析、可行性分析、概要设计、
    @目录前言1.需求分析2.可行性分析2.1简介2.2技术可行性分析2.2.1技术实现方案2.2.2开发人员技能要求2.2.3可行性2.3操作可行性分析2.4结论3.项目报告3.1修订历史记录3.2软硬件环境3.3需求分析3.4详细设计3.4.1类设计3.4.2核心流程描述3.4.3核心算法设计3.5运行......