基于比较的排序: 基础排序: 冒泡排序:谁大谁上,每一轮都把最大的顶到天花板 效率太低——掌握swap。选择排序:效率较低,但经常用它内部的循环方式来找最大值和最小值。插入排序:虽然平均效率低,但是在序列基本有序时,它很快,所以也有其适用范围。希尔排序(缩小增量排序):是插排的改良,对空间思维训练有帮助 时间复杂度O(n1.3),介于O(nlgn)~O(n2)之间 分治法:快速排序:是软件工业中最常见的常规排序法,其双向...
# 找到序列中最小元素,然后与第一个交换,如果第一个为最小和自己交换 # 再从剩下的元素中找到最小元素,与剩下的元素中的第一个交换。 # 核心的意思就是每次要在剩余元素中选出最小,排到前面的位置def select_sort(sort_list):"""选择排序"""n = len(sort_list)for i in range(n-1):min_index = ifor j in range(i+1, n):if sort_list[j]< sort_list[min_index]:min_index = iif min_index != i:sort_list[i], sort_list[min_in...
一,插入排序插入排序基本思想: 在一个已经有序的序列里插入新的元素,直到有序序列包含所有被排序元素。例子: 代码实现:void InsertSort(vector<int> &v) {for(int i = 1;i < v.size(); ++i)//i表示有序集合里的元素数目和待插入元素下标 {for(int j = i; j > 0 && v[j-1] > v[j]; --j){int temp = v[j-1];v[j-1] = v[j];v[j] = temp;}} }View Code时间复杂度为O(N^2)空间复杂度为O(1)插入排序在小规模数据时或者...
最近在看《算法导论》这本书,在练习题当中发现了这样的一个问题:使用二分查找法来实现插入排序,由于之前的内容当中有讲解二分法的递归实现,所以在这便将它们结合起来希望解决这个问题。闲话不多说了,直接上代码:// Algrithms.cpp : 定义控制台应用程序的入口点。 ////使用二分法来完成插入排序,并且使用递归算法来完成二分法 #include "stdafx.h"int Binary_Divide(int A[], int low, int height, int key){//递归终止的条件...
package cn.firstflag.crm.service;import org.apache.log4j.Logger;/*** * @author zhanmin.zheng**/publicclass mergerSortTest {privatestatic Logger log = Logger.getLogger(mergerSortTest.class);publicvoid merger() {int[] data = newint[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 }; mergerSort(data, 0, data.length-1);}publicstaticvoid mergerSort(int[] data, int left, int right) {if (left >= right) {return;}int center...
一、桶排序算法的引入。 之前我们已经说过了计数排序的算法。 这个时候我们如果有这样的一个待排序数据序列:int x[14]={-10, 2, 3, 7, 20, 23, 25, 40, 41, 43,60, 80, 90, 100}; 我们如果按照计数排序的算法,那么待排序数据的范围是:-10 到 100 我们为了实现对于这个数据集的遍历,这个时候需要额外的开辟一个大小为(100- (-10)+ 1)的空间,这个时候的空间复杂度达远远超过我们的预计,也就是这个造成了空间...
排序算法排序算法是一种比较简单的算法,从我们一开始接触计算机编程开始接触的可能就是排序或者搜索一类的算法,但是因为排序在其他的一些算法中应用较多,所以为了提高性能已经研究了多种排序算法。目前区别排序算法主要还是以时间复杂度,空间复杂度,稳定性等来排序,接下来我们分别分析。稳定性算法区别一个排序算法是否是稳定算法只需看相同的关键字在排序完成后是否保持原来两者的前后关系即可,比如对于[1,2,3,4,1],a[0]=a...
日常操作中常见的排序方法有:冒泡排序、快速排序、选择排序、插入排序、希尔排序等。冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。* 冒泡法排序* 比较相邻的元素。如果第一个比第二个大,就交换他们两个...
插入排序 直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的元素,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。 设数组为a[0…n-1]。 1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1 2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。 3. i++并重复第二步直到i==n-1。排序完成。 希尔排序 希尔排序的实质就是分组插入排序。...
基本思想插入排序(Insertion Sort)基本思想是:依次将待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。具体来说,对于一个有n个数据的序列,排序需要进行n-1趟插入操作。形象来看,每一趟插入操作就像大家玩扑克牌的摸牌阶段,我们使用左手拿着已经摸到并排好大小的牌,右手从牌堆里边摸牌,每摸一张牌就将其插入到左手理顺的牌中,插入后保持其大小顺序。具体来看整个排序过...
快速排序快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。排序流程快速排序算法通过多次比较和交换来实现排序,其排序流程如下:(1)首先设定一个分界值,通过...
一、冒泡排序排序原理:对一组数据,比较相邻数据的大小,把小的数据放在前面,值大的放在后面(升序排序)举例说明: $arr = [6, 3, 8, 2, 9, 1];第一轮排序: 第一次比较 6和3比较: 3 6 8 2 9 1 第二次比较 6和8比较: 3 6 8 2 9 1 第三次比较 8和2比较: 3 6 2 8 9 1 第四次比较 8和9比较: 3 6 2 8 9 1 第五次比较 9和1比较: 3 6 2 8 1 9 第一轮...
选择排序(Selection sort)是一种简单直观的排序算法。它首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。也就是:n个数从左至右,索引从0开始到n-1,两两依次比较,记录大值索引,此轮所有数比较完毕,将大数和索引0数交换,如果大数就是索引1,不交换。第二轮,从1开始比较,找到最大值,将...
冒泡排序比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较堆排序将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无须区;将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序...
Java排序算法(一)一、排序的基本概念和分类1.1排序的定义 在《大话数据结构》中,排序定义为,假设含有n个记录的序列为{r1,r2,...,rn},其相应的关键字{k1,k2,...,kn},需确定1,2...n的一种排列p1,p2...pn,是其相应的关键字满足Kp1<=Kp2<=...<=Kpn(非递减或非递增)关键,即使得序列称为一个按关键字有序的序列{rp1,rp2...rp3},这样的操作称为排序。1.2排序的稳定性 假设ki=kj(1<=i<=n,1<=j<=n,i!=j),且在排序前的序列中...