首页
学习
活动
专区
圈层
工具
发布

​精益求精单链表归并排序与快速排序

通过2个快慢指针,快指针每一步走2个节点,慢指针每一步走1个节点,当快指针到达链表尾部时,慢指针到达链表的中间节点。...(head); } ListNode* __mergesort(ListNode* node) { if(!...node->next) return node; ListNode *fast=node;//快指针走两步 ListNode *slow=node;//慢指针走一步 ListNode...); } 3.改变链接的快速排序 改变链接的指向思路: 将比枢椎(这里选择第一个节点)小的值,链接到一个小于枢椎的链表中; 比枢椎大的值,链接到一个大于枢椎的链表中; 将小于枢椎值的链表,枢椎节点,大于枢椎值的链表链接起来..., pivot); quickSort(pivot->next, tail); } } ListNode* sortList3(ListNode* head) { quickSort

2.3K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C#经典排序算法总结(三)之三种快速排序算法

    (arr, left, pivotIndex - 1,aa); QuickSort(arr, pivotIndex + 1, right,aa); } }...(arr, left, mid,aa); MergeSort(arr, mid + 1, right,aa); Merge(arr, left, mid, right,aa...虽然归并排序的时间复杂度与快速排序相同,但它的算法稳定性比快速排序更好,通常情况下效率也不低,因此对于大型数据排序和数据量不是特别大的情况下,归并排序是一种很好的选择。...其实际行时间比快速排序略慢,但是更适用于大数据量的排序,并且是外排序产生的基础算法。因此,一般来说,当待排序序列的数据量较大时,归并排序是更佳选择。...它具有不错的实际应用性能,同时对于数据有一定规模的情况下,它的效率比快速排序还要高。

    9510

    【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析

    //_QuickSort⽤于按照基准值将区间[left,right)中的元素进⾏划分 int meet = _QuickSort(a, left, right); QuickSort(a, left...从左到右找出比基准值大的数据,从右到左找出比基准值小的数据,左右指针数据交换,进入下一次循环 这里可能有一些问题, 1.跳出循环后,right位置的值一定不大于key?        ...,找到后立即放入左边 "坑" 中,当前位置变为新的 "坑",然后从左往右找出比基准值大的数据,找到后立即放入右边坑中,当前位置变为新的 "坑",结束循环后将最开始存储的分界值放入当前的 "坑"中,返回当前...代码实现: //归并排序 void _MergeSort(int* arr, int left, int right,int* tmp) { if (left >= right) { return...; } int mid = (left + right) / 2; _MergeSort(arr, left, mid, tmp); _MergeSort(arr, mid+1, right,

    31010

    Java数据结构与算法--排序算法

    插入排序;归并排序;快速排序; 前三种是基本排序算法,后两个是高级的排序算法; 冒泡排序 最慢 的排序算法之一,数据值会像气泡一样从数组的一段漂浮到另一端 基本思路: 1.依次比较相邻的两个数,如果第一个比第二个小...如果第一个比第二个大,调换顺序。一轮下来,最后一个是最大的数 2.对除了最后一个之外的数重复第一步,直到只剩一个数 图形展示: ?...(left), mergeSort(right)); return merge(mergeSort(left), mergeSort(right)); } //测试一下 var dataStore...比基准小的放到左边,比基准大的放到右边 2.再按此方法对这两部分数据分别进行快速排序(递归进行) 3.不能再分后退出递归,并将数组合并 图形展示: ?...(quickSort(dataStore));

    50920

    数据结构(C语言篇):(十九)归并排序和非比较排序

    int begin4 = clock(); HeapSort(a4, N); int end4 = clock(); int begin5 = clock(); QuickSort...printf("SelectSort:%d\n", end3 - begin3); printf("HeapSort:%d\n", end4 - begin4); printf("QuickSort...free(a3); free(a4); free(a5); free(a6); free(a7); } 我们分析代码的运行结果,可以得到以下结论: 快速排序(QuickSort...):最快,时间最短; 堆排序(HeapSort):略慢于快速排序,但性能稳定; 归并排序(MergeSort):与堆排序接近,略慢于快速排序; 希尔排序(ShellSort):比上述三种算法慢,但远快于简单排序...; 插入排序(InsertSort):明显慢于希尔排序; 选择排序(SelectSort):比插入排序更慢; 冒泡排序(BubbleSort):最慢,可能需要极长的时间。

    12410
    领券