排序算法总结

时间:2024.5.2

数据结构(C#版)

(一)简单排序方法

1、直接插入排序

直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。例如 int [] a=new int[]{42,20,17,27,13,8,48} 一般 设数组为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。排序完成。

先for循环 n-1次,插入数据,,跟前面的一个个比较。。

如果a[j]前一个数据a[j-1] > a[j],就交换a[j]和a[j-1],再j-- 直到a[j-1] <= a[j]。这样也可以实现将一个新数据新并入到有序区间。

//从小到大 直接插入排序方法

public static void InsertSort(SeqList<int> seqList)

{

for (int i = 1; i <=seqList .Last ; i++) //Last+1个元素,插入 Last次就行 {

for (int j = i-1; j >=0 && seqList[j+1]<seqList [j]; j--) //如果[1]<[0],即插入的比原有的小,则交换,,

{

int tmp = seqList[j];

seqList[j] = seqList[j + 1];

seqList[j+1] = tmp;

}

}

}

2、 冒泡排序(小的数往前冒“排”) 1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。

2.这样对数组的第N-1个数据到0个数据进行一次遍历后,最小的一个数据就“冒”到数组第0个位置。

3.重复前面二步,

冒泡排序毕竟是一种效率低下的排序方法,在数据规模很小时,可以采用。数据规模比较大时,最好用其它排序方法。 //从小到大 冒泡排序方法

public static void BubbleSort(SeqList<int> seqList)

{

for (int i = 0; i < seqList .Last ; i++) //last+1 个数,循环last次, 下标到last

{

for (int j=seqList.Last-1;j>=i ; j--)

{

if (seqList[j+1] < seqList[j]) //后面的数小

{

int tmp = seqList[j];

seqList[j] = seqList[j + 1];

seqList[j + 1] = tmp;

}

}

}

}

3、简单选择排序算法 1、设数组内存放了n个待排数字,数组下标从1开始,到n结束。

2、初始化i=1

3、从数组的第i个元素开始到第n个元素,寻找最小的元素。

4、将上一步找到的最小元素和第i位元素交换。

5、i++,直到i=n-1算法结束,否则回到第3步

选择排序的平均时间复杂度也是O(n^2)的。

//从小到大 简单选择排序方法

public static void SimpleSelectSort(SeqList<int> seqList)

{

//1.进行Last趟选择,每次选出第i小记录

for (int i = 0; i <seqList.Last; i++) //last+1 个数,循环last趟, 下标到last {

int minIndex=i;

for (int j = i + 1; j <= seqList.Last; j++) //2.选择第i小记录为a[minIndex] {

if (seqList[j] <seqList[minIndex ])

minIndex = j;

}

int tmp = seqList[i]; //3.与第i个记录交换

seqList[i] = seqList[minIndex];

seqList[minIndex] = tmp;

}

}

(二)快速排序 对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 //快速排序

public static void QuickSort(SeqList<int> seqList, int low, int high) {

{

{

--high;

}

seqList[low] = seqList[high];

{

++low ;

}

seqList [high ]=seqList [low ];

}

seqList[high] = seqList[low] = tmp;

low=high

{

QuickSort(seqList, i, low - 1);

}

low=high

{

QuickSort(seqList, low + 1, j);

}

}

int i = low; int j = high; int tmp = seqList[low]; //分界点 while (low<high ) while ((low<high)&&(seqList [high ]>=tmp)) //后边 比tmp大的 不动 //将 比tmp小的放在前面,low位置 while ((low < high) && (seqList[low] <= tmp)) //前面 比tmp小的 不动 //将 比tmp大的放在后面,high位置 //知道此时 low=high // 此时low=high ,就完成了以tmp值来分界 //分别对前后两部分来 快速排序 if (i < low - 1) //对tmp 前面的数(0到low-1) 递归调用,,此时【low】==tmp,if (low + 1 < j) //对tmp 后面的数(low+1到j) 递归调用,,此时【low】==tmp,


第二篇:各种排序算法整理总结


一、插入排序(Insertion Sort)

1. 基本思想:

每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。

2. 排序过程:

【示例】:

[初始关键字] [49] 38 65 97 76 13 27 49

J=2(38) [38 49] 65 97 76 13 27 49

J=3(65) [38 49 65] 97 76 13 27 49

J=4(97) [38 49 65 97] 76 13 27 49

J=5(76) [38 49 65 76 97] 13 27 49

J=6(13) [13 38 49 65 76 97] 27 49

J=7(27) [13 27 38 49 65 76 97] 49

J=8(49) [13 27 38 49 49 65 76 97]

复制内容到剪贴板

代码:

各种排序算法整理总结

二、选择排序

1. 基本思想:

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

2. 排序过程:

【示例】:

初始关键字 [49 38 65 97 76 13 27 49]

第一趟排序后 13 [38 65 97 76 49 27 49]

第二趟排序后 13 27 [65 97 76 49 38 49]

第三趟排序后 13 27 38 [97 76 49 65 49]

第四趟排序后 13 27 38 49 [49 97 65 76]

第五趟排序后 13 27 38 49 49 [97 97 76]

第六趟排序后 13 27 38 49 49 76 [76 97]

第七趟排序后 13 27 38 49 49 76 76 [ 97]

最后排序结果 13 27 38 49 49 76 76 97

复制内容到剪贴板

代码:

各种排序算法整理总结

各种排序算法整理总结

三、冒泡排序(BubbleSort)

1. 基本思想:

两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。

2. 排序过程:

设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。

【示例】:

49 13 13 13 13 13 13 13

38 49 27 27 27 27 27 27

65 38 49 38 38 38 38 38

97 65 38 49 49 49 49 49

76 97 65 49 49 49 49 49

13 76 97 65 65 65 65 65

27 27 76 97 76 76 76 76

49 49 49 76 97 97 97 97

复制内容到剪贴板

代码:

各种排序算法整理总结

四、快速排序(Quick Sort)

1. 基本思想:

在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。

2. 排序过程:

【示例】:

初始关键字 [49 38 65 97 76 13 27 49]

第一次交换后

[27 38 65 97 76 13 49 49]

第二次交换后

[27 38 49 97 76 13 65 49]

J向左扫描,位置不变,第三次交换后

[27 38 13 97 76 49 65 49]

I向右扫描,位置不变,第四次交换后

[27 38 13 49 76 97 65 49]

J向左扫描

[27 38 13 49 76 97 65 49]

(一次划分过程)

初始关键字

[49 38 65 97 76 13 27 49]

一趟排序之后

[27 38 13] 49 [76 97 65 49]

二趟排序之后

[13] 27 [38] 49 [49 65]76 [97]

三趟排序之后 13 27 38 49 49 [65]76 97

最后的排序结果 13 27 38 49 49 65 76 97

各趟排序之后的状态

复制内容到剪贴板

代码:

各种排序算法整理总结

各种排序算法整理总结

复制内容到剪贴板

代码:

五、堆排序(Heap Sort)

1. 基本思想:

堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。

2. 堆的定义: N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性: Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2])

堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均大于等于其孩子结点的关键字。例如序列10,15,56,25,30,70就是一个堆,它对应的完全二叉树如上图所示。这种堆中根结点(称为堆顶)的关键字最小,我们把它称为小根堆。反之,若完全二叉树中任一非叶子结点的关键字均大于等于其孩子的关键字,则称之为大根堆。

3. 排序过程:

堆排序正是利用小根堆(或大根堆)来选取当前无序区中关键字小(或最大)的记录实现排序的。我们不妨利用大根堆来排序。每一趟排序的基本操作是:将当前无序区调整为一个大根堆,选取关键字最大的堆顶记录,将它和无序区中的最后一个记录交换。这样,正好和直接选择排序相反,有序区是在原记录区的尾部形成并逐步向前扩大到整个记录区。

【示例】:对关键字序列42,13,91,23,24,16,05,88建堆

复制内容到剪贴板

代码:

各种排序算法整理总结

各种排序算法整理总结

复制内容到剪贴板

代码:

各种排序算法整理总结

六、几种排序算法的比较和选择

1. 选取排序方法需要考虑的因素:

(1) 待排序的元素数目n;

(2) 元素本身信息量的大小;

(3) 关键字的结构及其分布情况;

(4) 语言工具的条件,辅助空间的大小等。

2. 小结:

(1) 若n较小(n <= 50),则可以采用直接插入排序或直接选择排序。由于直接插入排序所需的记录移动操作较直接选择排序多,因而当记录本身信息量较大时,用直接选择排序较好。

(2) 若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。

(3) 若n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序。

快速排序是目前基于比较的内部排序法中被认为是最好的方法。

(4) 在基于比较排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程,由此可以证明:当文件的n个关键字随机分布时,任何借助于"比较"的排序算法,至少需要O(nlog2n)的时间。

这句话很重要 它告诉我们自己写的算法 是有改进到最优 当然没有必要一直追求最优

(5) 当记录本身信息量较大时,为避免耗费大量时间移动记录,可以用链表作为存储结构。

更多相关推荐:
c语言 排序算法总结

排序算法总结选择法排序:for(i=0;i9;i++){max=i;for(j=i+1;j10;j++)if(a[max]a[j])max=j;/*max为查找范围最大数所在元素下标*/if(max!=i)(i…

c语言排序算法总结(主要是代码实现)

冒泡排序(BubbleSort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。…

排序算法总结

按平均时间将排序分为四类:(1)平方阶(O(n2))排序一般称为简单排序,例如直接插入、直接选择和冒泡排序;(2)线性对数阶(O(nlgn))排序如快速、堆和归并排序;(3)O(n1+£)阶排序£是介于0和1之…

计算机考研 数据结构 查找和排序算法总结

查找算法总结静态查找n1顺序表的查找-顺序查找:查找成功时的平均查找长度ASL=n?n?i?1=i?1(n?1)2,查找不成功时的比较次数为n+1,故查找成功与不成功等概率时的平均查找长度为12n?(n?i?1…

八大排序算法总结

八大排序算法总结插入排序1.直接插入排序原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。要点:设立哨兵,作为临时存储和判…

排序算法总结

现有序列{9,3,5,1,6,2,8,4,7},以此为例子,阐述各个常用排序算法。直接插入排序:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大…

用php实现的各种排序算法总结

用php实现的各种排序算法总结优化php性能的五个实用技巧:以下是五个优化技巧,熟练掌握后对于开发还是很有帮助的。1.对字符串使用单引号PHP引擎允许使用单引号和双引号来封装字符串变量,但是这个是有很大的差别的…

最常用的排序算法总结

实际应用中最常用的排序是快速排序和堆排序所谓堆排序就是将最小的一个值放到堆栈的顶部这样就可以使最后出来的数完成排序快速排序是不稳定的堆排序是稳定的所谓稳定就是当两个值相等时排序后两个值的顺序和排序前相同以上两种...

排序算法总结大全(10种)

10种排序算法总结20xx0920120117我来说两句收藏我要投稿排序算法有很多所以在特定情景中使用哪一种算法很重要为了选择合适的算法可以按照建议的顺序考虑以下标准1执行时间2存储空间3编程工作对于数据量较小...

排列组合问题解法总结

排列组合问题的解法排列组合问题联系实际生动有趣但题型多样思路灵活因此解决排列组合问题首先要认真审题弄清楚是排列问题组合问题还是排列与组合综合问题其次要抓住问题的本质特征采用合理恰当的方法来处理教学目标1进一步理...

内排序算法总结

内排序算法总结packagecomSoerAlgorithmimportjavautilArrayspublicclassSelectSortparamargspublicstaticvoidmainStrin...

排序算法总结

一插入排序InsertionSort1基本思想每次将一个待排序的数据元素插入到前面已经排好序的数列中的适当位置使数列依然有序直到待排序数据元素全部插入完为止2排序过程示例初始关键字493865977613274...

排序算法总结(64篇)