//快速排序: #include <stdio.h> #define MAX 500000 int s[MAX]; void Q_Sort(int start,int end) { int i,j,t; if ( start >= end ) return ; t = s[start]; i = start; j = end; while ( i < j) { while ( s[j] >= t && i < j) { j--; } s[i] = s[j…
2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和折半查找相结合,提高查找插入位置的速度,也就是折半插入排序,此处没有给出这种方法的相应代码. 对排序算法,可从以下几个方面评价: 时间复杂度: 空间复杂度: 稳定性. 代码(测试暂未发现问题,欢迎交流指正!): #include <iostream> #include <cassert>…
最近在准备笔试题和面试题,把学到的东西整理出来,一来是给自己留个笔记,二来是帮助大家学习. 题目: 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例:  输入:[1,2,3,5,2,3],6 返回:[1,2,2,3,3,5] 代码示例: 冒泡排序:O(n^2) 最基本的排序,不多解释. class BubbleSort: def bubbleSort(self, A, n): for x in xrange(n): for y in xrange(n-x-1): if A[y]…
这三种排序算法的性能比较如下: 排序名称 时间复杂度(平均) 时间复杂度(最坏) 辅助空间 稳定性 快速排序 O(nlogn) O(n*n) O(nlogn) 不稳定 堆排序 O(nlogn) O(nlogn) O(1) 不稳定 归并排序 O(nlogn) O(nlogn) O(n) 稳定 以下除特殊说明外均针对元素数为n的一个序列. 1.归并排序 归并排序的基本思想是递归地将两个或多个有序子序列合并成一个新的有序子序列,最终得到一个长度为n的有序序列. 看这里,我们先将序列看成n个有序的子序列…
归并排序 使用分治法:分而治之 分: 递归地拆分数组,直到它被分成两对单个元素数组为止. 然后,将这些单个元素中的每一个与它的对合并,然后将这些对与它们的对等合并,直到整个列表按照排序顺序合并为止. 治: 将2个排序列表合并为另一个排序列表是很简单的. 简单地通过比较每个列表的头,删除最小的,以加入新排序的列表. O(n) 操作 图示: 动图: 实现 # 合并 def merge(a, b): c = [] while len(a) > 0 and len(b) > 0: if a[0] &l…
内部排序: 就是使用内存空间来排序 外部排序: 就是数据量很大,需要借助外部存储(文件)来排序. 直接上代码: package com.lvcai; public class Sort { public static void main(String[] args) { //排序 分为: 内部排序(使用内存来排序) , 外部排序(需要借助外部存储) // 内部排序: // int[] array = {100, 6, 9, 2, 1, 0, 54,23,5}; // int[] arr = ne…
复习快速排序,用C语言实现: #include <stdio.h> int quicksort(int begin, int end, int a[], int len); void main() { , , , , , , , }; int len = sizeof(a)/sizeof(int); ; ; int pivot; pivot = quicksort(i, j, a, len); //printf("\npivot:%d\n", pivot); //for(i…
这篇文章是David MacKay利用信息论,来对快排.堆排的本质差异导致的性能差异进行的比较. 信息论是非常强大的,它并不只是一个用来分析理论最优决策的工具. 从信息论的角度来分析算法效率是一件很有趣的事,它给我们分析排序算法带来了一种新的思路. 运用了信息论的概念,我们很容易理解为什么快排的速度那么快,以及它的缺陷在哪里. 由于个人能力不足,对于本文的理解可能还是有点偏差. 而且因为翻译的困难,这篇译文有很多地方并没有翻译出来,还是使用了原文的句子. 所以建议大家还是阅读原文Heapsort…
题目链接:https://www.luogu.org/problemnew/show/P1177 题意:输入 $n$ 以及后续 $n$ 个整数,让你将这 $n$ 个整数从小到大排序输出. 归并排序(用时: 121ms / 内存: 1568KB): #include<bits/stdc++.h> using namespace std; +; int n,a[maxn],t[maxn]; void Merge(int l,int m,int r) { ; int k=l; while(i<…
\(des\) 给定长度为 \(n\) 的数组,要求翻转一段区间 \([l, r]\) 使其升序排列. 要求 \(\sum r - l + 1 <= 2e7\) \(sol\) 考虑快速排序,每次选择一个 \(mid\),把 \(<= mid\) 的数放大左边, \(>= mid\) 的数放到右边,递归下去. 把 \(<= mid\) 的数看做 \(0\), \(>= mid\) 的数看做 \(1\), 就相当于 \(0/1\) 序列排 序,类似归并排序,每次把左右两部分排好…