算法这个东西其实在开发中不多用到,特别是web开发中,可是算法也很重要,由于任何的程序,任何的软件,都是由不少的算法和数据结构组成的。可是这不意味着算法对于每一个软件设计人员的实际工做都是很重要的。每一个项目特色和需求特殊也致使算法运用场景上不一样。可是我的以为算法运用的好的话会给本身在程序设计的时候提供比较好的思路。下面就对一些排序算法小结一下,就当作本身的一个笔记吧。web
1.简介算法
插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工做原理是经过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,一般采用in-place排序(即只需用到O(1)的额外空间的排序),于是在从后向前扫描过程当中,须要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。数组
2.算法描述数据结构
通常来讲,插入排序都采用in-place在数组上实现。具体算法描述以下:
1.从第一个元素开始,该元素能够认为已经被排序
2.取出下一个元素,在已经排序的元素序列中从后向前扫描
3.若是该元素(已排序)大于新元素,将该元素移到下一位置
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5.将新元素插入到该位置后
6.重复步骤2~5
若是比较操做的代价比交换操做大的话,能够采用二分查找法来减小比较操做的数目。该算法能够认为是插入排序的一个变种,称为二分查找排序。性能
3.使用插入排序为一列数字进行排序的过程 spa
最差时间复杂度 设计
最优时间复杂度 code
平均时间复杂度orm
4.C#实现blog
/// <summary> /// 插入排序 /// </summary> public class InsertionSorter { public void Sort(int[] list) { for (int i = 1; i < list.Length; ++i) { int t = list[i]; int j = i; while ((j > 0) && (list[j - 1] > t)) { list[j] = list[j - 1]; --j; } list[j] = t; } } }
数组
int[] iArrary = new int[] { 1, 5, 3, 6, 10, 55, 9, 2, 87, 12, 34, 75, 33, 47 };
1.简介
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
2.算法实现
原始的算法实如今最坏的状况下须要进行O(n2)的比较和交换。V. Pratt的书[1] 对算法进行了少许修改,可使得性能提高至O(n log2 n)。这比最好的比较算法的O(n log n)要差一些。
希尔排序经过将比较的所有元素分为几个区域来提高插入排序的性能。这样可让一个元素能够一次性地朝最终位置前进一大步。而后算法再取愈来愈小的步长进行排序,算法的最后一步就是普通的插入排序,可是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。
假设有一个很小的数据在一个已按升序排好序的数组的末端。若是用复杂度为O(n2)的排序(冒泡排序或插入排序),可能会进行n次的比较和交换才能将该数据移至正确位置。而希尔排序会用较大的步长移动数据,因此小数据只需进行少数比较和交换便可到正确位置。
一个更好理解的希尔排序实现:将数组列在一个表中并对列排序(用插入排序)。重复这过程,不过每次用更长的列来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法自己仅仅对原数组进行排序(经过增长索引的步长,例如是用i += step_size而不是i++)。
3.排序过程
最差时间复杂度 根据步长串行的不一样而不一样。
最优时间复杂度 O(n)
平均时间复杂度 根据步长串行的不一样而不一样。
4.C#实现
/// <summary> /// 希尔排序 /// </summary> public class ShellSorter { public void Sort(int[] list) { int inc; for (inc = 1; inc <= list.Length / 9; inc = 3 * inc + 1) ; for (; inc > 0; inc /= 3) { for (int i = inc + 1; i <= list.Length; i += inc) { int t = list[i - 1]; int j = i; while ((j > inc) && (list[j - inc - 1] > t)) { list[j - 1] = list[j - inc - 1]; j -= inc; } list[j - 1] = t; } } } }
1.简介
选择排序(Selection sort)是一种简单直观的排序算法。它的工做原理以下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,而后,再从剩余未排序元素中继续寻找最小(大)元素,而后放到已排序序列的末尾。以此类推,直到全部元素均排序完毕。
选择排序的主要优势与数据移动有关。若是某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,所以对n个元素的表进行排序总共进行至多n-1次交换。在全部的彻底依靠交换去移动元素的排序方法中,选择排序属于很是好的一种。
2.实现过程
最差时间复杂度 О(n²)
最优时间复杂度 О(n²)
平均时间复杂度 О(n²)
3.C#实现
/// <summary> /// 选择排序 /// </summary> public class SelectionSorter { // public enum comp {COMP_LESS,COMP_EQUAL,COMP_GRTR}; private int min; // private int m=0; public void Sort(int[] list) { for (int i = 0; i < list.Length - 1; ++i) { min = i; for (int j = i + 1; j < list.Length; ++j) { if (list[j] < list[min]) min = j; } int t = list[min]; list[min] = list[i]; list[i] = t; // Console.WriteLine("{0}",list[i]); } } }
1.简介
冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,若是他们的顺序错误就把他们交换过来。走访数列的工做是重复地进行直到没有再须要交换,也就是说该数列已经排序完成。这个算法的名字由来是由于越小的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序对n个项目须要O(n^{2})的比较次数,且能够原地排序。尽管这个算法是最简单了解和实做的排序算法之一,但它对于少数元素以外的数列排序是很没有效率的。
冒泡排序是与插入排序拥有相等的执行时间,可是两种法在须要的交换次数却很大地不一样。在最坏的状况,冒泡排序须要O(n^{2})次交换,而插入排序只要最多O(n)交换。冒泡排序的实现(相似下面)一般会对已经排序好的数列拙劣地执行(O(n^{2})),而插入排序在这个例子只须要O(n)个运算。所以不少现代的算法教科书避免使用冒泡排序,而用插入排序取代之。冒泡排序若是能在内部循环第一次执行时,使用一个旗标来表示有无须要交换的可能,也有可能把最好的复杂度下降到O(n)。在这个状况,在已经排序好的数列就无交换的须要。若在每次走访数列时,把走访顺序和比较大小反过来,也能够稍微地改进效率。有时候称为往返排序,由于算法会从数列的一端到另外一端之间穿梭往返。
2.算法实现
1.比较相邻的元素。若是第一个比第二个大,就交换他们两个。
2.对每一对相邻元素做一样的工做,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对全部的元素重复以上的步骤,除了最后一个。
4.持续每次对愈来愈少的元素重复上面的步骤,直到没有任何一对数字须要比较。
3.实现过程
最差时间复杂度
最优时间复杂度
平均时间复杂度
4.C#实现
/// <summary> /// 冒泡排序 /// </summary> public class bubblesort { public void BubbleSort(int[] R) { int i, j, temp; //交换标志 bool exchange; for (i = 0; i < R.Length; i++) //最多作R.Length-1趟排序 { exchange = false; //本趟排序开始前,交换标志应为假 for (j = R.Length - 2; j >= i; j--) { if (R[j + 1] < R[j]) //交换条件 { temp = R[j + 1]; R[j + 1] = R[j]; R[j] = temp; exchange = true; //发生了交换,故将交换标志置为真 } } if (!exchange) //本趟排序未发生交换,提早终止算法 { break; } } } }