首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏乐行僧的博客

    5-希尔排序算法

    思想: 增量排序,先部分有序,然后整体有序。 与插入排序的思想是一致的。 不稳定的排序算法 #include <stdio.h> void show(int *a, int n) { int i = 0; for (i = 0; i < n; i++) a[j] = x; } d /= 3; } } int main() { int a[] = {3, 1, 2, 4, 7, 0, 5,

    29840编辑于 2022-02-25
  • 来自专栏ACM算法日常

    基础算法|5 快速排序

    我们之前学习了冒泡排序算法,我们知道,在冒泡排序过程中,只对相邻的两个元素进行比较,因此每次交换两个相邻的元素时只能消除一个逆序。 如果能通过两个(不相邻)元素的一次交换,消除多个逆序,则会大大加快排序的速度。而这就是本篇文章讲述的另一种基本排序算法——快速排序算法。 ---- 快速排序的算法思想 通过一次元素的交换消除多个逆序,以提高排序的效率。 Sample Input 5 2 4 1 3 5 Sample Output 3 题意:有N(N为奇数)头奶牛产奶,求这N头奶牛产奶的中位数。 总述 快速排序算法是一种效率较高的排序算法,它是在冒泡排序的基础之上的进行改进得来的。你学会了吗ヾ(◍°∇°◍)ノ゙

    87120发布于 2018-11-07
  • 来自专栏明志德到的IT笔记

    C# 排序算法5:归并排序

    归并排序,是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。该算法是采用分治法。 原理:   1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列   2.设定两个指针,最初位置分别为两个已经排序序列的起始位置   3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间 ,并移动指针到下一位置   4.重复步骤3直到某一指针超出序列尾,将另一序列剩下的所有元素直接复制到合并序列尾 图示:  上图中首先把一个未排序的序列从中间分割成2部分,再把2部分分成4部分,依次分割下去 tempArr[tempIndex++]; } return arr; } 运行结果 Console.WriteLine($"数据算法 "); var arr1 = GetArrayData(20, 1,22); Console.WriteLine($"生成未排序数据

    53320编辑于 2023-10-21
  • 来自专栏惊羽-布壳儿

    算法练习(5) - 归并排序

    void mergeSort_test() { // Integer[] A = {31,41,59,26,41,58}; Integer[] A = {9,8,7,6,5,4,3,2,1 int[] temp) { int piLeft = leftIndex; int piRight = middle + 1; int tIndex = 0; // 将排序好的

    30830编辑于 2022-06-15
  • 来自专栏Hsinyan写字的地方

    Python算法实践Week5-排序算法

    选择排序共需比较N-1轮,总共比较的轮数为(N-1)+(N-2)+...+2+1=N(N-1)/2次 选择排序执行交换的次数是N-1次 0x02 冒泡排序 算法思想 第一轮比较:从第一个元素开始,按照顺序对列表中所有 第二轮比较:从第一个元素开始,对列表中前N-1个元素之间进行两两比较,使第二大的数字沉到最后 以此类推,N-1轮后,排序完毕 冒泡排序算法的实现 list = [77, 42, 35, 10, 22, 算法主要时间消耗是比较的次数 冒泡算法共需比较N-1轮,总共比较次数为(N-1)+(N-2)+...+2+1=N(N-1)/2次 冒泡排序执行交换的次数不确定 冒泡排序是一种执行效率很低的排序算法 0x03 算法思想 将包含N个元素的列表拆分成两个含N/2个元素的子列表 对两个子列表递归调用归并排序(最后可将整个列表分为N个子列表) 合并两个已经排序好的子列表 归并排序算法的实现 def merge(left , 11, 10, 33, 42] temp = mergeSort(a) print(temp) python语言系统提供的排序算法,底层就采用了归并排序算法实现 a = sorted([24, 8,

    53110编辑于 2022-06-19
  • 来自专栏C/C++与音视频

    排序算法5----归并法

    归并排序也称合并排序,其算法思想是将待排序序列分为两部分,依次对分得的两个部分再次使用归并排序,之后再对其进行合并。

    44330编辑于 2022-06-14
  • 来自专栏菩提树下的杨过

    算法练习(5)-计数排序法及优化

    日常开发中,会遇到一些特定的排序场景:“待排序的值”范围很明细,比如:基金的星级排名,客服的好评星级排名,一般星级排名也就从1星到5星。 这种情况下,有一个经典的“下标计数排序法”,可以用O(n)的时间复杂度完成排序: static void sort0() { int[] arr = new int[]{5, 4 } } System.out.println("\n"); } 输出: indexCountArr=>[0, 1, 1, 1, 2, 1] 1 2 3 4 4 5 但这是一个不稳定的排序算法,而且输出结果只有值,如果是一个复杂的对象,比如下面这样: static class EmpScore { public String empNo; [] arr) { //排序过程(下标计数排序) Map<Integer, List<EmpScore>> scoreMap = new HashMap<>(arr.length

    61530发布于 2021-03-27
  • 来自专栏技术博文

    算法-排序算法-选择排序

    /** * 排序算法-选择排序 * 选择排序(Selection Sort)算法也是比较简单的排序算法,其思路比较直观。选择排序算法在每一步中选取最小值来重新排列,从而达到排序的目的。 * 选择排序算法通过选择和交换来实现排序,其排序流程如下: * (1)首先从原始数组中选择最小的1个数据,将其和位于第1个位置的数据交换。 至此,便完成了对原始数组的从小到大的排序。 * * 选择排序算法在对n个数据进行排序时,无论原数据有无顺序,都需要进行n-1步的中间排序。 * 这种排序方法思路很简单直观,但是缺点是执行的步骤稍长,效率不高。 size; i++) { ints[i] = (int)(Math.random() * 100 ); } System.out.println("排序前的数组

    2.3K30发布于 2021-03-11
  • 来自专栏技术博文

    算法-排序算法-冒泡排序

    /** * 排序算法-冒泡排序 * 冒泡排序(Bubble Sort)算法是所有排序算法中最简单、最基本的一种。 * 冒泡排序算法的思路就是交换排序,通过相邻数据的交换来达到排序的目的。 * 冒泡排序的思路: * (1)对数组中的各数据,依次比较相邻的两个元素的大小。 * (2)如果前面的数据大于后面的数据,就交换这两个数据。经过第一轮的多次比较排序后,便可将最小的数据排好。 * 冒泡排序算法在对n个数据进行排序时,无论原数据有无顺序,都需要进行(i = n-1)次的外层循环。 * 每次内部的排序随着步骤的递增,需要排序的数据逐步减少,所以需要 (n - i)次的内层循环,注意:i从1开始 */ import java.util.*; public class BubbleSort :" + Arrays.toString(ints)); } System.out.println("最终排序后的数组:" + Arrays.toString(ints)

    1.5K20发布于 2021-03-08
  • 来自专栏xiaosen

    数据结构算法--5 归并排序

    (li) 如果感觉不清楚这个过程,我们可以把递归最后一步merge(li,low,mid,high)改为print打印出来 [4, 7, 2, 8, 10, 13, 12, 6, 1, 11, 3, 5, [4, 7] [2, 8] [4, 7, 2, 8] [10, 13] [12, 6] [10, 13, 12, 6] [4, 7, 2, 8, 10, 13, 12, 6] [1, 11] [3, 5] [1, 11, 3, 5] [9, 0] [14, 15] [9, 0, 14, 15] [1, 11, 3, 5, 9, 0, 14, 15] [4, 7, 2, 8, 10, 13, 12, 6, 1, 11, 3, 5, 9, 0, 14, 15] 我们可以看出递归排序是从小到大执行,且从左向右 且归并排序时间复杂度O(nlogn),空间复杂度O(n) 快排,归并,堆排序对比: 一般情况下:快速排序 <归并排序<堆排序 三种排序方法的缺点: 快速排序:极端情况下排序效率低 归并排序:需要额外的内存开销 堆排序:在快的排序算法中相对较慢

    37310编辑于 2024-03-15
  • 来自专栏技术博文

    算法-排序算法-快速排序

    /** * 排序算法-快速排序 * 快速排序(Quick Sort)算法和冒泡排序算法类似,都是基于交换排序思想的。快速排序算法对冒泡排序算法进行了改进,从而具有更高的执行效率。 * 快速排序算法通过多次比较和交换来实现排序,过程如下: * (1)首先设定一个分界值,通过该分界值将数组分成左右两部分。 * (3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样将左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。 当左、右两部分各数据排序完成后,整个数组的排序也就完成了。 :" + Arrays.toString(ints)); quickSortFun(ints, 0, size - 1); System.out.println("排序后的数组

    1.4K10发布于 2021-03-17
  • 来自专栏技术博文

    算法-排序算法-希尔排序

    /** * 排序算法-希尔排序 * 冒泡排序算法、选择排序算法和插入排序算法,虽然思路比较直观,但是排序的效率比较低。 * 对于大量的数据需要排序时,往往需要寻求其他更为高效的排序算法。 Shell排序算法便是其中一种 * Shell排序算法严格来说基于插入排序的思想,其又称为希尔排序或者缩小增量排序,思路如下: * (1)将有n个元素的数组分成n/2个数字序列,第1个数据和第n/2 * (3)然后,再变为n/4个序列,再次排序。 * (4)不断重复上述过程,随着序列减少最后变为一个,也就完成了整个排序。 size; i++) { ints[i] = (int)(Math.random() * 100 ); } System.out.println("排序前的数组 :" + Arrays.toString(ints)); } System.out.println("排序后的数组:" + Arrays.toString(ints))

    1.2K20发布于 2021-03-12
  • 来自专栏技术博文

    算法-排序算法-插入排序

    /** * 排序算法-插入排序 * 插入排序(Insertion Sort)算法通过对未排序的数据执行逐个插入至合适的位置而完成排序工作。 * 插入排序算法的思路比较简单,应用比较多。 * 插入排序算法通过比较和插入来实现排序,其排序流程如下: * (1)首先对数组的前两个数据进行从小到大的排序。 * (2)接着将第3个数据与排好序的两个数据比较,将第3个数据插入合适的位置。 最后,便完成了对原始数组从小到大的排序。 * * 插入排序算法在对n个数据进行排序时,无论原数据有无顺序,都需要进行n-1步的中间排序。 * 这种排序方法思路简单直观,在数据已有一定顺序的情况下,排序效率较好。但如果数据无规则,则需要移动大量的数据,其排序效率也不高。 size; i++) { ints[i] = (int)(Math.random() * 100 ); } System.out.println("排序前的数组

    95220发布于 2021-03-11
  • 来自专栏用代码征服天下

    算法——排序算法

    8 3 7 5 6 最小数据2,把2放在首位,2原来就在首位,不需要交换 排序结果:2 8 3 7 5 6 ---------------------------------------------- --------- 第二趟排序: 原始数据:8 3 7 5 6(2已经排好序了,不需要再排序了) 最小数据3,8和3交换 排序结果:2 3 8 7 5 6 ----------------------- -------------------------------- 第三趟排序: 原始数据:8 7 5 6(2、3已经排好序了,不需要再排序了) 最小数据5,5和8交换 排序结果:2 3 5 7 8 6 6和7交换 排序结果:2 3 5 6 8 7 ------------------------------------------------------- 第五趟排序: 原始数据:8 7(2、3、5、 6已经排好序了,不需要再排序了) 最小数据7,7和8交换 排序结果:2 3 5 6 7 8 排序完成 代码示例: 1 package com.alibaba; 2 3 import org.junit.jupiter.api.Test

    1.1K10编辑于 2022-05-09
  • 来自专栏JavaEE

    排序算法 --- 桶排序

    一、排序思想 之前将的计数排序,有些局限性,比如数列最大值和最小值差距不能太大,而且只能排整数。桶排序就对这些局限性做了弥补。桶排序的思想就是每个桶代表一个区间范围,里面可以装若干个元素。 然后对这些桶内部进行排序,最后遍历这些桶,那么数列就是有序的了。 案例: 假如现在有如下数列: 4.5, 0.84, 3.25, 2.18, 0.5 首先创建与元素个数相同的桶,这里就创建5个桶; 最后一个桶让它只包含最大元素,即只包含4.5; 最大数是 桶排序 然后开始遍历原始数列,把元素放入对应的桶中,如下: ? 桶排序 对每个桶内部的元素进行排序,如下: ? 桶排序 最后遍历所有的桶,输出的元素就是有序的了。 桶排序的缺点:如果数据分布不均衡,比如最大值1000,最小值0.5,剩余元素都是零点几的,也就是说最后一个桶放最大元素,其他元素都在第一个桶,这样性能就会下降,并且创建了很多空桶,浪费空间。

    63651发布于 2020-10-10
  • 来自专栏JavaEE

    排序算法 --- 快速排序

    ---- 案例: 假如待排序列如下: ? 初始状态 选定6为基准数,然后先从右边开始遍历,找到一个比基准数小的数,如下图: ? 找到比基准数小的5 右边找到比基准数小的时候,右边先停下,再从左边开始遍历,找到比基准数大的,如下图: ? 找到比基准数大的7 这个时候,左右两边都先停下,交换5和7的位置,结果如下: ? 找到比基准数小的4 找到后停下,再从左往右找比基准数大的,即从5开始找,结果如下: ? 找到比基准数大的9 这个时候,左右两边都停下,交换9和4的位置,结果如下: ? 第一躺排序完成 此时6左边的都是比它小的,右边的都是比它大的。左边部分和右边部分看成是两个新的待排序列,两个序列都按照上述方式再进行排序,先排左边,再排右边。 ,左边和右边看成新数组,重复上述步骤 sort(arr, j+1, right); // 排右边 sort(arr, left, i-1); // 排左边 } 快速排序之所以成为快速排序

    98231发布于 2020-10-10
  • 来自专栏程序编程之旅

    排序算法:冒泡排序

    冒泡排序算法的运作如下:(从后往前) ​1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。 若记录序列的初始状态为”正序”,则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为”逆序”,则需进行n(n-1)/2次比较和记录移动。 因此冒泡排序总的时间复杂度为O(n*n)。 : 在排序过程中,执行完最后的排序后,虽然数据已全部排序完备,但程序无法判断是否完成排序,为了解决这一不足,可设置一个标志位flag,将其初始值设置为非0,表示被排序的表是一个无序的表,每一次排序开始前设置 在新一轮排序开始时,检查此标志,若此标志为0,表示上一次没有做过交换数据,则结束排序;否则进行排序;

    84120发布于 2021-01-21
  • 来自专栏程序编程之旅

    排序算法:希尔排序

    希尔排序法(缩小增量法) 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法。 //shell排序 /* 基本思想:将序列分成几类,在类里将它分成几个小组,再让它在小组内进行排序,依次重复直至排序成功 1,找出间距gap(分类)最后间距分类必须为1, 第一重循环 2, 找出各组 , j,flag,gap=n; int tmmp; while(gap>1) { gap=gap/2;//缩小增量,每次减半 do//子序列应用冒泡排序 =0);//优化冒泡排序 } } main() { int i,a[10] = {-12,23,345,1,34,-45,34,3,2,5}; printf("原序列的元素排序为 for(i=0; i<10; i++) { printf("%d ",a[i]); } shellsort(a,10); printf("\n排序后的元素位置

    44410发布于 2021-01-21
  • 来自专栏程序编程之旅

    排序算法:选择排序

    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 //1 选择排序 selectSort1(a); print(a); long endTime = System.currentTimeMillis()

    1.3K20发布于 2021-01-21
  • 来自专栏学习

    【排序算法】冒泡排序

    2.数据演示 例如: 第0次排序:5  1  6  3  2  9 第1次排序:1  5  3  2  6  9 第2次排序:1  3  2  5  6  9 第3次排序:1  2  3  5   6  9 第4次排序:1  2  3 5  6  9 第5次排序:1  2  3  5  6  9  在第一次排序中:1小于5交换位置,然后5和6比较,位置不变,然后6和3比较,交换位置,然后 ; 即每次交换时,都要将最大的数放在队尾部分,且最后一次交换后,最小的数就不用比较了,所以循环次数为数组长度减去1; 3.算法思路 小编认为,在写代码时,要用两个循环嵌套,内循环进行数字的交换,外循环来确定内循环执行几次 } }  在算法中交换两个数值要先用一个变量存储其中一个值,然后在交换后,将变量赋值给另一个即可完成交换。 5, 6, 9] 第5次排序后[1, 2, 3, 5, 6, 9] 排序结束,最终排序为[1, 2, 3, 5, 6, 9] 5.代码优化 如上图演示的过程,在排序中,数组已经有序,但是仍要按循环规定次数执行

    41510编辑于 2024-09-24
领券