排序算法

排序算法复习—直接插入排序

馋奶兔 提交于 2020-03-17 18:22:42
直接插入排序的 工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序 在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 具体算法描述如下: 1.从第一个元素开始,该元素可以认为已经被排序 2.取出下一个元素,在已经排序的元素序列中从后向前扫描 3.如果该元素(已排序)大于新元素,将该元素移到下一位置 4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 5.将新元素插入到该位置后 6.重复步骤2~5 还是代码看着直接,C语言实现如下: 1 int a[]={2,5,4,6,3}; 2 int length=sizeof(a)/sizeof(int); 3 int n=length-1; 4 int i,j,key; 5 6 for(i=1; i<=n;i++) 7 { 8 if(a[i]<a[i-1]) 9 { 10 key=a[i]; 11 for(j=i-1;j>=0&&a[j]>key;j--) 12 { 13 a[j+1]=a[j];//后移 14 } 15 a[j+1]=key; 16 } 17 } 在STL的sort算法和stdlib的qsort算法中,都将插入排序作为快速排序的补充

基础算法之插入排序Insertion Sort

早过忘川 提交于 2020-03-17 18:22:17
原理 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。相信大家都打过扑克牌,很好理解。 例子 将数组[5,6,3,1,8,7,2,4]进行从小到大排序 排序步骤: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 将新元素插入到该位置后 重复步骤2~5 动画演示 代码参考      static void Main(string[] args) { int[] intArray = { 3, 6, 4, 2, 5, 1 }; Insertion_Sort(intArray); foreach (var item in intArray) { Console.WriteLine(item); } Console.ReadLine(); } static void Insertion_Sort(int[] unsorted) { int i, j, temp; for (i = 1; i < unsorted.Length; i++) { //

排序系列之插入排序

孤街浪徒 提交于 2020-03-17 18:21:18
插入排序 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。 插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。 分 类 :直接插入排序,二分插入排序 直接插入排序 直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。 描述 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: ⒈ 从第一个元素开始,该元素可以认为已经被排序 ⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描 ⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置 ⒋ 重复步骤3

用AS3实现插入排序算法

こ雲淡風輕ζ 提交于 2020-03-17 18:20:41
插入排序 (Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 算法描述 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 1.从第一个元素开始,该元素可以认为已经被排序 2.取出下一个元素,在已经排序的元素序列中从后向前扫描 3.如果该元素(已排序)大于新元素,将该元素移到下一位置 4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 5.将新元素插入到该位置中 6.重复步骤2~5 如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找排序。 维基百科 代码:稍后整理.... 来源: https://www.cnblogs.com/finger/archive/2012/05/19/2508988.html

[算法] 插入排序 Insertion Sort

孤者浪人 提交于 2020-03-17 18:20:16
插入排序(Insertion Sort) 是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序 在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 一般来说, 插入排序 都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 将新元素插入到该位置后 重复步骤2~5 如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是 插入排序 的一个变种,称为二分查找插入排序。 从数据第二个元素开始遍历 0 1 2 3 4 5 20 40 30 10 60 50 20 40 30 10 60 50 20 30 40 10 60 50 10 20 30 40 60 50 10 20 30 40 50 60 i=1; temp=a[1]=40; j=i-1=0; a[0]>40,若前面的元素比当前元素大。 i=2; temp=a[2]=30, j=i-1=1;a[1]

JavaScript的9大排序算法详解

时间秒杀一切 提交于 2020-03-17 18:14:58
一.插入排序 1.算法简介 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 2.算法描述和实现 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(已排序)大于新元素,将该元素移到下一位置; 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置; 将新元素插入到该位置后; 重复步骤2~5。 JavaScript代码实现: function insertionSort(array) { if (Object.prototype.toString.call(array).slice(8, -1) === ‘Array’) { for (var i = 1; i < array.length; i++) { var key = array[i]; var j = i – 1; while (j >= 0 && array[j] > key) { array[j

经典排序算法学习笔记五——直接选择排序

喜夏-厌秋 提交于 2020-03-17 17:40:42
直接选择排序 数据结构 数组 最差时间复杂度 O( n^2 ) 最优时间复杂度 O( n^2 ) 平均时间复杂度 O( n^2 ) 最差空间复杂度 О(n) total, O(1) auxiliary 1、算法思想 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。 以此类推,直到所有元素均排序完毕。 2、伪代码 repeat (numOfElements - 1) times set the first unsorted element as the minimum for each of the unsorted elements if element < currentMinimum set element as new minimum swap minimum with first unsorted position 3、实现 void selection_sort(int arr[], int len) { int i, j, min, temp; for (i = 0; i < len - 1; i++) { min = i; for (j = i + 1; j < len; j++) if (arr[min] > arr[j]) min = j; temp = arr[min];

java算法(一) 直接选择排序

邮差的信 提交于 2020-03-17 17:40:22
一、基本概念 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置(注:要把最大最小的元素和起始的元素交换), 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 二、算法特点 是否稳定:  false 平均时间复杂度:O(n^2) 最差时间复杂度:O(n^2) 最优时间复杂度:O(n^2) package com.jiafuwei.java; /** * java 选择排序 * @author jfw * */ public class SelectionSort { public static void main(String[] args) { int [] collections = {36,23,56,789,342,456,34,7,234,4578,32}; SelectionSort selectionSort = new SelectionSort(); selectionSort.sort(collections); for (int i = 0; i < collections.length; i++) { System.out.print(collections[i]+" "); } } public void sort(int [] data) { for(int k=0;k<data

排序算法--选择排序(Selection Sort)_C#程序实现

家住魔仙堡 提交于 2020-03-17 17:37:26
排序算法--选择排序(Selection Sort)_C#程序实现   排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题。例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困难。同样,存储在计算机中的数据的次序,对于处理这些数据的算法的速度和简便性而言,也具有非常深远的意义。 1.基本概念   排序是把一个记录(在排序中把数据元素称为记录)集合或序列重新排列成按记录的某个数据项值递增(或递减)的序列。 2选择排序(Selection Sort)   选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 2.1算法描述 n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下: 初始状态:无序区为R[1..n],有序区为空; 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区; n-1趟结束

排序算法之选择排序

随声附和 提交于 2020-03-17 17:28:00
基本思想: 在长度为N的无序数组中,第一次遍历n-1个数,找到最小的数值与第一个元素交换; 第二次遍历n-2个数,找到最小的数值与第二个元素交换; 。。。 第n-1次遍历,找到最小的数值与第n-1个元素交换,排序完成。 平均时间复杂度: O(n2) 过程: 代码: public int[] selectSort(int[] array){ for(int i = 0;i < array.length - 1;i++){ int minindex = i; for(int j = i + 1; j < array.length;j++){ if(array[j] < array[minindex]){ minindex = j; } } if(minindex != i){ array[i] = array[i] ^ array[minindex]; array[minindex] = array[i] ^ array[minindex]; array[i] = array[i] ^ array[minindex]; } } return array; }   总结: 时间复杂度 : 选择排序的交换操作介于 0 和 (n - 1) 次之间。选择排序的比较操作为 n (n - 1) / 2 次之间,比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n