各种排序算法整理总结
C程序经典算法50例

C程序经典算法50例1.二分查找算法:在有序数组中查找指定元素。
2.冒泡排序算法:通过不断比较相邻元素并交换位置,将较大的元素向后冒泡。
3.快速排序算法:通过选择一个基准元素,将数组分割为左右两部分,并递归地对两部分进行快速排序。
4.插入排序算法:将数组划分为已排序和未排序两部分,每次从未排序中选择一个元素插入到已排序的合适位置。
5.选择排序算法:遍历数组,每次选择最小元素并放置在已排序部分的末尾。
6.希尔排序算法:将数组按照一定间隔进行分组并分别进行插入排序,然后逐步减小间隔并重复这个过程。
7.归并排序算法:将数组递归地划分为两部分,然后将两个有序的部分进行合并。
8.桶排序算法:将元素根据特定的映射函数映射到不同的桶中,然后对每个桶分别进行排序。
9.计数排序算法:统计每个元素的出现次数,然后根据计数进行排序。
10.基数排序算法:从低位到高位依次对元素进行排序。
11.斐波那契数列算法:计算斐波那契数列的第n项。
12.阶乘算法:计算给定数字的阶乘。
13.排列问题算法:生成给定数组的全排列。
14.组合问题算法:生成给定数组的所有组合。
15.最大连续子序列和算法:找出给定数组中和最大的连续子序列。
16.最长递增子序列算法:找出给定数组中的最长递增子序列。
17.最长公共子序列算法:找出两个给定字符串的最长公共子序列。
18.最短路径算法:计算给定有向图的最短路径。
19.最小生成树算法:构建给定连通图的最小生成树。
20.汉诺塔算法:将n个圆盘从一个柱子移动到另一个柱子的问题。
21.BFS算法:广度优先算法,用于图的遍历和查找最短路径。
22.DFS算法:深度优先算法,用于图的遍历和查找连通分量。
23.KMP算法:字符串匹配算法,用于查找一个字符串是否在另一个字符串中出现。
24.贪心算法:每次都选择当前情况下最优的方案,适用于求解一些最优化问题。
25.动态规划算法:将一个大问题划分为多个子问题,并通过子问题的解求解整个问题,适用于求解一些最优化问题。
数据结构最基础的十大算法

数据结构最基础的十大算法数据结构是计算机科学中的重要分支,它研究如何组织和存储数据以便于访问和修改。
在数据结构中,算法是解决问题的关键。
下面将介绍数据结构中最基础的十大算法。
1. 线性搜索算法线性搜索算法是最简单的算法之一,它的作用是在一个列表中查找一个特定的元素。
该算法的时间复杂度为O(n),其中n是列表中元素的数量。
2. 二分搜索算法二分搜索算法是一种更高效的搜索算法,它的时间复杂度为O(log n)。
该算法要求列表必须是有序的,它通过将列表分成两半来查找元素,直到找到目标元素为止。
3. 冒泡排序算法冒泡排序算法是一种简单的排序算法,它的时间复杂度为O(n^2)。
该算法通过比较相邻的元素并交换它们的位置来排序列表。
4. 快速排序算法快速排序算法是一种更高效的排序算法,它的时间复杂度为O(nlog n)。
该算法通过选择一个基准元素并将列表分成两部分来排序列表。
5. 插入排序算法插入排序算法是一种简单的排序算法,它的时间复杂度为O(n^2)。
该算法通过将每个元素插入到已排序的列表中来排序列表。
6. 选择排序算法选择排序算法是一种简单的排序算法,它的时间复杂度为O(n^2)。
该算法通过选择最小的元素并将其放在列表的开头来排序列表。
7. 堆排序算法堆排序算法是一种更高效的排序算法,它的时间复杂度为O(n log n)。
该算法通过将列表转换为堆并进行排序来排序列表。
8. 归并排序算法归并排序算法是一种更高效的排序算法,它的时间复杂度为O(n log n)。
该算法通过将列表分成两部分并将它们合并来排序列表。
9. 哈希表算法哈希表算法是一种高效的数据结构,它的时间复杂度为O(1)。
该算法通过将键映射到哈希表中的位置来存储和访问值。
10. 树算法树算法是一种重要的数据结构,它的时间复杂度取决于树的深度。
树算法包括二叉树、AVL树、红黑树等。
以上是数据结构中最基础的十大算法,它们在计算机科学中有着广泛的应用。
数字的顺序排列

数字的顺序排列数字是人类生活中不可或缺的一部分,它们用于计数、测量、排序和表示各种信息。
在日常生活和工作中,我们经常需要对数字进行排列,以便更好地理解和使用它们。
本文将讨论数字的顺序排列,包括升序排列和降序排列两种方式,帮助读者更好地理解和应用数字。
1. 升序排列升序排列是指按照数字的大小从小到大进行排列。
这种排列方式常用于从低到高、从早到晚等方面的排序。
例如,我们可以按照数字的升序排列来组织一组数据或者安排事件的顺序。
假设我们有以下一组数字:4, 2, 7, 5, 1, 9, 8, 3, 6。
要将这组数字按照升序排列,我们可以使用不同的排序算法,如冒泡排序、插入排序或快速排序等。
下面以冒泡排序为例进行说明:首先,比较相邻的两个数字,如果前一个数字大于后一个数字,则将它们交换位置。
对于上述示例数据,第一轮比较后得到:2, 4, 7, 5, 1, 9, 8, 3, 6。
然后,再次比较相邻的数字,并进行交换,直到整个序列按照升序排列。
经过多次比较和交换,最终得到的升序排列为:1, 2, 3, 4, 5, 6, 7, 8, 9。
2. 降序排列降序排列是指按照数字的大小从大到小进行排列。
与升序排列相反,降序排列常用于从高到低、从晚到早等方面的排序。
同样,我们可以使用不同的排序算法来实现降序排列。
以下以选择排序算法为例进行说明:首先,找到序列中的最大数字,并将其与序列的第一个数字交换位置。
对于上述示例数据,第一轮操作后得到:9, 4, 7, 5, 1, 2, 8, 3, 6。
然后,在剩下的数字中再次找到最大数字,并将其与序列的第二个数字交换位置。
依此类推,直到整个序列按照降序排列。
经过多次比较和交换,最终得到的降序排列为:9, 8, 7, 6, 5, 4, 3, 2, 1。
3. 应用范例数字的顺序排列在实际生活和工作中具有广泛的应用。
以下是几个常见的应用范例:3.1 学生成绩排名学生成绩通常按照降序排列,以便教师和学生清楚地了解谁在班级或学校中表现最好。
长度的大小比较与排序

长度的大小比较与排序在日常生活中,我们经常会遇到需要比较和排序不同对象长度的情况。
无论是衣柜里的衣服,还是书架上的书籍,我们常常需要按照长度的大小对它们进行整理。
在本文中,我们将探讨长度的大小比较和排序的方法。
一、长度的比较长度的比较是一种常见的比较方式,它可以用来确定两个或多个对象的大小关系。
在实际应用中,我们可以通过以下几种方式进行长度的比较。
1. 直接比较直接比较是最简单直接的比较方法,它可以通过量尺或测量工具来获取对象的长度,并将其进行比较。
例如,我们可以用尺子测量两本书的长度,然后比较它们的大小关系。
这种方法适用于需要精确比较长度的情况。
2. 间接比较间接比较是通过其他属性或指标来推测对象的长度大小。
例如,我们可以通过比较两本书的页数来判断它们的长度关系。
通常情况下,页数越多,书的长度越长。
这种方法适用于无法直接测量长度的情况。
3. 近似比较近似比较是一种基于估计的比较方法,它通过观察对象外观或与其他对象的比较来判断长度大小。
例如,我们可以通过观察两个衣物的相对长度来判断它们的大小关系。
这种方法适用于快速判断长度大小的场合。
二、长度的排序长度的排序是将多个对象按照长度的大小顺序进行排列。
在实践中,我们可以使用以下几种方法进行长度的排序。
1. 冒泡排序冒泡排序是一种简单直观的排序算法,它通过比较相邻对象的长度大小,并根据需要进行交换,逐步将最大或最小的对象“冒泡”到合适的位置。
这个过程会重复多次,直到所有对象按照长度大小排序完成。
2. 快速排序快速排序是一种高效的排序算法,它通过将对象分为小于或大于基准值的两个子序列,然后对子序列进行递归排序,最终将所有对象按照长度大小排列。
快速排序的核心思想是通过不断划分序列,减少比较次数,提高排序效率。
3. 归并排序归并排序是一种稳定的排序算法,它通过将对象分成若干个长度相等或相差不大的子序列,然后对每个子序列进行排序,最后将所有子序列合并成一个有序序列。
excel60甲子排列组合算法

Excel60甲子排列组合算法一、引言在Excel中,我们经常需要进行排列和组合的计算,特别是在处理数据分析和统计的过程中。
而对于我国传统的六十甲子,也是一种十分有趣的排列组合。
接下来,我们将探讨Excel中如何使用排列组合算法来实现六十甲子的计算,并将其应用于实际的数据处理中。
二、六十甲子简介六十甲子是我国古代用于纪年的一种方法,它是通过干支纪年的方式来表示年份。
干支纪年是由“天干”和“地支”两个周期性纪年方法相合并而来的纪年法。
天干包括甲、乙、丙、丁、戊、己、庚、辛、壬、癸,地支包括子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。
将天干和地支相合并得到六十个甲子,在我国传统文化中具有重要的纪年意义。
三、Excel中的排列组合算法在Excel中,可以使用排列组合算法来计算六十甲子的排列组合。
在实际操作中,可以通过以下步骤来实现:1. 使用Excel的数据填充功能,输入天干和地支的数据。
2. 利用Excel的排列组合函数,计算出所有可能的排列组合。
3. 使用筛选和排序功能,将计算结果进行整理和展示。
四、排列组合算法的应用在数据分析和统计的过程中,我们可以利用排列组合算法来进行各种计算,比如在确定某一年份的干支纪年之后,可以通过排列组合算法来计算出该年份对应的六十甲子。
在文化研究和历史考证方面,排列组合算法也可以被广泛应用,比如在研究古代历法和纪年法时,可以利用排列组合算法来进行相关计算和推论。
五、个人观点和理解对于六十甲子的排列组合算法,我个人认为它不仅具有很高的纪年价值,而且也是我国传统文化中的一种独特而有趣的计算方法。
在今天的信息时代,我们可以借助现代化的工具和技术,比如Excel,来更加便捷地进行六十甲子的计算和应用。
这也充分展现了传统文化与现代科技的结合和发展。
六、总结与展望通过本文的探讨,我们了解了在Excel中利用排列组合算法来计算六十甲子的方法和应用。
通过实际操作,我们可以更深入地理解和应用六十甲子,并发现其中的更多魅力和价值。
几种重要的排序方法

⼏种重要的排序⽅法1.插⼊排序(insertion sort)如图所⽰,将需要排序的序列,分成已排序的部分,和未排序的部分。
循环中,每⼀次就将当前迭代到的,未排序的第⼀个元素,插⼊到在已排序部分中的适当位置。
2.选择排序(selection sort)如图所⽰,⾸先便利所有未排序的元素,找出最⼤的⼀个,然后与数组中的最后⼀个交换。
下⼀次迭代就从未排序的元素中,找出最⼤的⼀个,与数组中倒数第⼆个交换,以此类推。
3. 希尔排序(shell sort)希尔排序,主要是将各元素按⼀个递减的增量,来对元素分组排序,如图所⽰,⼀开始increment为5,则将元素分为5组,每组3个,元素在组内先按⼤⼩排序好。
然后increment按(increment = increment / 3 + 1)的形式进⾏递减,则第⼆次迭代increment为3,则将元素分为3组,再在组内进⾏排序。
直到increment⼩于等于1。
具体算法:void shell_sort() {int increment, start;increment = array.count;do {increment = increment / 3 + 1;for (start = 0; start < increment; start++) {sort_interval(start, increment);}} while(increment > 1);}4. 归并排序(merge sort)归并排序是采⽤分治法的⼀种。
通过直接将数组对半分,然后分成2部分数组,进⾏递归,直到数组中元素为⼀个,则函数直接返回,⽽⽗函数就将两个数组中的元素进⾏⽐较,合并成为⼀个已经排好序的数组。
具体算法:void recursive_merge_sort(Node*& sub_list) {if (sub_list != NULL && sub_list -> next != NULL) {Node *second_half = divide_from(sub_list);recursive_merge_sort(sub_list);recursive_merge_sort(second_half);sub_list = merge(sub_list, second_half);}}5. 快排(quick sort)快排的核⼼,其实也是分治法。
数字的正序与倒序排列
数字的正序与倒序排列 数字的排列方式可以分为正序和倒序两种。正序排列是指从小到大的顺序排列数字,而倒序排列则是指从大到小的逆序排列数字。在数学和计算机科学中,数字的正序和倒序排列是非常重要的概念。
1. 正序排列 正序排列是人们最常见的数字排列方式。它按照数字的大小依次递增的方式进行排列。例如,我们将一组数字进行正序排列如下:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 在正序排列中,每个数字都比前一个数字大。这种排列方式在日常生活中经常出现,比如我们按照时间的顺序来安排会议,按照字母表的顺序整理单词等。
2. 倒序排列 与正序排列相反,倒序排列是指数字按照递减的方式进行排列。下面是一组数字的倒序排列:
10, 9, 8, 7, 6, 5, 4, 3, 2, 1 在倒序排列中,每个数字都比前一个数字小。倒序排列的应用场景较少,但在某些情况下也是十分有用的,比如对数字进行降序排序,或者按照优先级进行逆序排列等。
3. 数字排列的应用 数字的正序和倒序排列在实际应用中有着广泛的应用。以下是一些例子:
3.1 排序算法 排序算法是计算机科学中的一个重要主题,它研究如何将一组数字按照一定的顺序重新排列。常见的排序算法包括冒泡排序、选择排序、插入排序、归并排序等。这些排序算法可以按照正序或倒序排列数字,从而使得数字数据更有序、更易于处理。
3.2 数据库查询结果排序 在数据库操作中,查询结果可以按照正序或倒序排列。例如,我们可以根据某个字段的值对记录进行排序,以便更方便地获取需要的信息。通过指定排序方式,我们可以按照需求获取正序或倒序排列的结果集。
3.3 数字的显示和比较 在日常生活中,数字的排列方式也经常用于数字的显示和比较。例如,我们将电话号码按照正序排列,以便更容易拨号。另外,数字的比较也常常使用正序排列,例如在数学比赛中对学生的分数进行排名。
总结: 数字的正序与倒序排列是人们常见的数字排列方式,正序是从小到大的排列,倒序是从大到小的排列。这些排列方式在数学、计算机科学、数据库等领域都有广泛的应用。无论是进行算法排序、数据库查询结果的排序,还是数字的显示和比较,了解和灵活运用正序和倒序排列是非常重要的。只有正确理解和使用这些排列方式,我们才能更好地处理数字数据,满足各种需求。
全排列算法解析(完整版)
void Permutation(int A[], int m, int n) {
int i, int temp; if(m = = n)
{ for(i = 0;i<n;i++) { if(i != n-1) printf("%d ",A[i]); //有加空格 else printf("%d" A[i]); //没加空格 } //直接输出,因为前 n-1 个数已经确定,递归到只有 1 个数。 printf("\n"); return;
C语言常用简单算法
C语言常用简单算法C语言是一种广泛应用的编程语言,支持各种算法的实现。
以下是一些常用的简单算法,涵盖了排序、查找、递归等方面。
1. 冒泡排序(Bubble Sort):通过不断比较相邻元素的大小,将较大的元素逐步“冒泡”到数组的末尾。
2. 选择排序(Selection Sort):每次从未排序的数组中选择最小(或最大)的元素,放到已排序数组的末尾。
3. 插入排序(Insertion Sort):将数组分为已排序和未排序两个部分,每次将未排序部分中的元素插入到已排序部分的正确位置。
4. 快速排序(Quick Sort):选择一个基准元素,将数组分成两部分,将小于基准的元素放在左边,大于基准的元素放在右边,然后递归地对两部分进行排序。
5. 归并排序(Merge Sort):将待排序数组递归地分成两部分,分别进行排序,然后再将两个有序的数组合并成一个有序的数组。
6. 二分查找(Binary Search):对于有序数组,通过比较中间元素和目标值的大小,缩小查找范围,直到找到目标值或查找范围为空。
7. 线性查找(Linear Search):对于无序数组,逐个比较数组中的元素和目标值,直到找到目标值或遍历完整个数组。
8. 求阶乘(Factorial):使用递归方式或循环方式计算给定数字的阶乘。
9. 斐波那契数列(Fibonacci Sequence):使用递归方式或循环方式生成斐波那契数列。
10. 汉诺塔(Tower of Hanoi):使用递归方式实现汉诺塔问题的解决,将一组盘子从一个柱子移动到另一个柱子。
11. 判断回文数(Palindrome):判断给定数字是否为回文数,即正序和倒序相同。
12.求最大公约数(GCD):使用辗转相除法或欧几里德算法求两个数的最大公约数。
13.求最小公倍数(LCM):通过最大公约数求得最小公倍数。
14. 求质数(Prime Number):判断给定数是否为质数,即只能被1和自身整除。
长度的比较与排序
长度的比较与排序在日常生活和工作中,我们经常会遇到需要比较和排序不同项目或事物长度的情况。
无论是衡量尺寸、排列物品还是确定顺序,了解和掌握长度的比较与排序方法是十分重要的。
本文将介绍几种常见的长度比较与排序的实用方法,帮助读者更好地解决相关问题。
1. 尺寸比较当需要比较两个或多个物体的尺寸大小时,我们可以使用一些常见的方法来进行比较。
最基本的方法是直接比较物体的长度。
可以使用非常规单位例如“米”、“厘米”、“英寸”来表达尺寸,确保比较的准确性。
此外,还可以使用比例尺或比较图来直观地展示物体的尺寸大小。
在进行尺寸比较时,我们可以按照从小到大或从大到小的顺序进行比较。
如果需要精确的比较结果,可以使用测量工具如尺子、卷尺等对物体进行具体测量,从而对比尺寸差异。
2. 排序方法排序是对一组对象按照一定的规则进行排列的过程。
在排序中,常用的方法包括冒泡排序、插入排序、选择排序、快速排序等。
冒泡排序是一种简单直观的排序算法,它通过比较相邻元素的大小,依次将较大的元素移至数组末尾。
该算法重复执行遍历和比较的步骤,直到所有元素按照要求排序。
插入排序则是通过构建有序子数组的方式进行排序。
该方法会将数组分为已排序和未排序两部分,然后依次将未排序部分的元素插入到已排序部分的正确位置,直到整个数组排序完成。
选择排序是一种简单直观的排序算法,它通过不断选择剩余元素中最小的元素,将其与当前位置进行交换,从而达到排序的目的。
快速排序是一种基于分治思想的高效排序算法。
该算法通过选取一个基准元素,将数组分为小于基准元素和大于基准元素两个子数组,然后对子数组递归地进行排序,最终得到排序结果。
3. 应用场景长度的比较与排序在生活和工作中广泛应用。
比如在建筑工程中,我们需要衡量房屋的尺寸,以便设计和施工;在物流行业,需要安排货物的运输和存储,必须根据货物的大小合理排序;在学术研究中,需要对实验数据进行排序和比较,以得出准确的结论。
此外,对于个人而言,了解长度比较与排序的方法也十分实用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、插入排序(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]
复制内容到剪贴板 代码:
Procedure InsertSort(Var R : FileType); //对R[1..N]按递增序进行插入排序, R[0]是监视哨// Begin for I := 2 To N Do //依次插入R[2],...,R[n]// begin R[0] := R; J := I - 1; While R[0] < R[J] Do //查找R的插入位置// begin R[J+1] := R[J]; //将大于R的元素后移// J := J - 1 end R[J + 1] := R[0] ; //插入R // end End; //InsertSort //
二、选择排序 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
复制内容到剪贴板 代码:
Procedure SelectSort(Var R : FileType); //对R[1..N]进行直接选择排序 // Begin for I := 1 To N - 1 Do //做N - 1趟选择排序// begin K := I; For J := I + 1 To N Do //在当前无序区R[I..N]中选最小的元素R[K]// begin If R[J] < R[K] Then K := J end; If K <> I Then //交换R和R[K] // begin Temp := R; R := R[K]; R[K] := Temp; end; end End; //SelectSort //
三、冒泡排序(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
复制内容到剪贴板 代码:
Procedure BubbleSort(Var R : FileType) //从下往上扫描的起泡排序// Begin For I := 1 To N-1 Do //做N-1趟排序// begin NoSwap := True; //置未排序的标志// For J := N - 1 DownTo 1 Do //从底部往上扫描// begin If R[J+1]< R[J] Then //交换元素// begin Temp := R[J+1]; R[J+1 := R[J]; R[J] := Temp; NoSwap := False end; end; If NoSwap Then Return//本趟排序中未发生交换,则终止算法// end End; //BubbleSort//
四、快速排序(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 各趟排序之后的状态
复制内容到剪贴板 代码: Procedure Parttion(Var R : FileType; L, H : Integer; Var I : Integer); //对无序区R[1,H]做划分,I给以出本次划分后已被定位的基准元素的位置 // Begin I := 1; J := H; X := R ;//初始化,X为基准// Repeat While (R[J] >= X) And (I < J) Do begin J := J - 1 //从右向左扫描,查找第1个小于 X的元素// If I < J Then //已找到R[J] 〈X// begin R := R[J]; //相当于交换R和R[J]// I := I + 1 end; While (R <= X) And (I < J) Do I := I + 1 //从左向右扫描,查找第1个大于 X的元素/// end; If I < J Then //已找到R > X // begin R[J] := R; //相当于交换R和R[J]// J := J - 1 end Until I = J; R := X //基准X已被最终定位// End; //Parttion //
复制内容到剪贴板 代码:
Procedure QuickSort(Var R :FileType; S,T: Integer); //对R[S..T]快速排序// Begin If S < T Then //当R[S..T]为空或只有一个元素是无需排序// begin Partion(R, S, T, I); //对R[S..T]做划分// QuickSort(R, S, I-1);//递归处理左区间R[S,I-1]// QuickSort(R, I+1,T);//递归处理右区间R[I+1..T] // end; End; //QuickSort//
五、堆排序(Heap Sort) 1. 基本思想: 堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。