常见排序算法总结
- 格式:doc
- 大小:47.50 KB
- 文档页数:3
数字顺序从小到大排列数字数字是我们日常生活中不可或缺的一部分。
无论是购物、计算、时间还是通讯等等,我们都要用到数字。
因此,了解数字的排列顺序对我们来说至关重要。
在这篇文章中,我们将探讨数字顺序从小到大排列的方法和意义。
数字的排列顺序是指将一组数字按照从小到大的方式进行排序。
这种排序方式使得数字更加有序,并且方便我们进行比较和分析。
下面,我们将介绍几种常见的数字排序方法。
一、冒泡排序冒泡排序是最简单、最基础的排序算法之一。
它通过相邻元素的比较和交换来实现排序。
具体步骤如下:1. 从左到右遍历数组,比较相邻的两个元素。
2. 如果前一个元素大于后一个元素,交换它们的位置。
3. 重复上述步骤,直到没有任何元素需要交换为止。
这样,我们就能够将最大的数字移到数组的最后一位。
接着,我们再次遍历剩下的元素,重复上述过程,直到整个数组排序完成。
二、插入排序插入排序是将未排序的数字逐个插入到已排序的数字序列中的排序算法。
具体步骤如下:1. 假设第一个数字已经排好序,从第二个数字开始遍历。
2. 将当前数字与已排序序列中的元素进行比较,找到合适的位置插入。
3. 插入后,移动已排序序列中的元素,为新的数字腾出位置。
4. 重复上述步骤,直到所有数字都被插入到正确的位置。
三、选择排序选择排序是每次从未排序序列中选择一个最小(或最大)的数字放到已排序序列的末尾的排序算法。
具体步骤如下:1. 设立一个标志位,记录最小(或最大)数字的位置。
2. 遍历未排序序列,找到最小(或最大)的数字。
3. 将找到的数字与未排序序列的第一个数字进行交换。
4. 重复上述步骤,直到所有数字都被排序。
以上是几种常见的数字排序算法,它们各有特点,在不同的场景中有不同的应用。
无论使用哪种排序方法,都能够将数字按照从小到大的顺序排列。
数字的顺序排列对于我们的日常生活和工作有着重要的意义。
首先,有序的数字使我们能够更方便地进行计算和比较。
无论是购物还是财务管理,我们都需要对数字进行排序。
C语言七大算法一、概述算法是计算机程序设计中解决问题的方法和步骤的描述,是计算机科学的重要基础。
在计算机科学中,有许多经典的算法被广泛应用,并成为不可或缺的工具。
本文将介绍C语言中的七大经典算法,包括排序算法、查找算法、图算法、字符串算法、动态规划算法、贪心算法和分治算法。
二、排序算法排序是将一组元素按照特定规则进行重新排列的过程。
常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。
这些排序算法在C语言中都有相应的实现,并且各有特点和适用场景。
三、查找算法查找算法用于在一组数据中查找特定值的位置或判断是否存在。
常见的查找算法有线性查找、二分查找、哈希查找等。
这些算法在C语言中的实现可以帮助我们快速地定位目标值。
四、图算法图算法用于解决与图相关的问题,包括最短路径问题、最小生成树问题、拓扑排序等。
在C语言中,我们可以利用图的邻接矩阵或邻接表来实现相关的图算法。
五、字符串算法字符串算法主要用于解决字符串匹配、替换、拼接等问题。
在C语言中,我们可以使用字符串库函数来完成一些基本的字符串操作,例如字符串比较、复制、连接等。
六、动态规划算法动态规划算法是解决一类最优化问题的常用方法,它将问题分解为多个子问题,并通过保存已解决子问题的结果来避免重复计算。
在C语言中,我们可以使用动态规划算法来解决背包问题、最长公共子序列问题等。
七、贪心算法贪心算法是一种通过每一步的局部最优选择来达到全局最优的方法。
贪心算法通常在解决最优化问题时使用,它快速、简单,并且可以给出近似最优解。
C语言中可以使用贪心算法来解决霍夫曼编码、最小生成树等问题。
八、分治算法分治算法是一种将问题分解为多个相同或类似的子问题然后递归解决的方法。
常见的分治算法有快速排序、归并排序等。
在C语言中,我们可以使用分治算法来提高程序的效率和性能。
总结:本文介绍了C语言中的七大经典算法,包括排序算法、查找算法、图算法、字符串算法、动态规划算法、贪心算法和分治算法。
VB常用算法介绍在VB程序开发中,常常需要使用各种算法来处理数据和解决问题。
下面将介绍几种常用的VB算法,包括排序算法、算法和图算法等。
1.排序算法排序算法用来将一组数据按照一定的规则进行排列。
常见的排序算法包括冒泡排序、选择排序、插入排序、归并排序和快速排序等。
冒泡排序(Bubble Sort)是一种交换排序算法,通过不断地相邻元素比较和交换,将较大的元素逐渐交换到末尾,从而实现排序。
冒泡排序的时间复杂度为O(n^2)。
选择排序(Selection Sort)是一种排序算法,每次从待排序的数据元素中选择最小(或最大)的一个元素,放到已排序的序列的末尾。
选择排序的时间复杂度为O(n^2)。
插入排序(Insertion Sort)是一种排序算法,将数组元素分为已排序和未排序两部分,每次从未排序的部分中取出一个元素,插入到已排序的部分的适当位置。
插入排序的时间复杂度为O(n^2)。
归并排序(Merge Sort)是一种分治排序算法,将待排序的数据分为两个子序列,然后递归地对子序列进行排序,并将两个已排序的子序列合并成一个有序序列。
归并排序的时间复杂度为O(nlogn)。
快速排序(Quick Sort)是一种分治排序算法,通过一次划分将待排数据分成左右两个子序列,然后递归地对子序列进行排序。
快速排序的时间复杂度为O(nlogn)。
2.算法算法用来在一个数据集合中查找一些元素或满足特定条件的元素。
常见的算法包括线性、二分和深度优先。
线性(Linear Search)是一种简单的算法,从数据集合的第一个元素开始逐个比较,直到找到目标元素或遍历完整个集合。
线性的时间复杂度为O(n)。
二分(Binary Search)是一种在有序数据集合中查找目标元素的算法,通过每次将范围缩小一半来快速定位目标元素。
二分的时间复杂度为O(logn)。
深度优先(Depth-First Search,DFS)是一种用来在图或树结构中遍历所有节点的算法,从一个起始节点开始,先遍历一个邻接节点,然后再递归地遍历该邻接节点的邻接节点。
常用算法解析及其应用场景算法是计算机科学中最基础的概念之一。
在日常生活中,我们无时无刻不在接触着各种算法,从谷歌搜索到智能手机里各种APP的推荐算法,都离不开算法的支持和应用。
在这篇文章中,我将为大家介绍常用的算法和它们的应用场景。
一、排序算法排序算法是程序中最常用的一种算法,其目的是将数据按一定方式进行排列。
常见的排序算法包括冒泡排序、选择排序、插入排序、归并排序和快速排序。
1、冒泡排序冒泡排序是一种简单的排序算法,它的思路是从头到尾扫描一遍需要排序的数据,每一次将相邻两个元素进行比较并交换位置。
这个过程类似于水泡在水中上浮,一遍扫描结束后,最大的元素就会像水泡一样浮到最上面。
冒泡排序的时间复杂度为O(n²),如果需要排序的数据量很大,那么执行起来会比较慢。
不过它的优点在于代码简单易懂,并且实现起来很容易。
2、选择排序选择排序的思路是每次从数据中选择一个最小(或最大)的元素,并将其放置在序列的起始位置。
按照这样的方式,每次只需要找到一个元素,就可以将数据序列排列好。
选择排序的时间复杂度也为O(n²),但它比冒泡排序要稍微快一点。
3、插入排序插入排序的思路是将数据分为已排序区间和未排序区间两部分。
不断地将未排序区间的元素逐一与已排序区间的元素相比较,找到合适的位置插入。
重复执行这个过程,最终就能将整个数据序列排列好。
插入排序的时间复杂度也为O(n²),但它的执行速度相对于冒泡排序和选择排序要慢一些。
不过它的优点在于它在处理小数据量时非常高效,并且在排序过程中需要的额外内存很少。
4、归并排序归并排序的思路是将数据分成两个子序列,分别进行排序,最后将排序好的子序列进行合并。
在合并的过程中,需要使用到一个额外的数组来存储数据。
归并排序的时间复杂度为O(nlogn),执行效率相对较高。
尤其是在处理大数据量时,它表现得十分出色。
5、快速排序快速排序的思路不同于以上几种排序算法,它是一种分治法的排序算法。
计算机常用算法一、排序算法排序算法是计算机程序中最基本的算法之一,它用于将一组数据按照一定的顺序进行排列。
常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。
这些算法的目标都是将数据从小到大或从大到小进行排序,以便于后续的处理和查找。
冒泡排序是一种简单的排序算法,它通过不断比较相邻元素的大小来将较大(或较小)的元素逐步交换到右侧(或左侧)。
选择排序则是依次选取未排序部分的最小(或最大)元素并放置到已排序部分的末尾。
插入排序则是将未排序部分的元素依次插入到已排序部分的合适位置。
快速排序是一种高效的排序算法,它通过选择一个基准元素,将数组划分为两个子数组,并对子数组进行递归排序。
归并排序则是将数组分成两个子数组,分别排序后再合并。
二、查找算法查找算法是用于在一组数据中寻找特定元素或满足特定条件的元素的算法。
常见的查找算法包括线性查找、二分查找、哈希查找等。
这些算法的目标都是在最短的时间内找到目标元素。
线性查找是最简单的查找算法,它依次遍历数据中的每个元素,直到找到目标元素或遍历完所有元素。
二分查找则是在有序数组中使用的一种查找算法,它通过不断缩小查找范围,将查找时间从O(n)降低到O(logn)。
哈希查找则是通过构建一个哈希表来实现的,将元素的关键字映射到对应的位置,以实现快速查找。
三、图算法图算法是解决图相关问题的算法,它在计算机科学中有着广泛的应用。
常见的图算法包括深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra算法、Floyd-Warshall算法)、最小生成树算法(Prim算法、Kruskal算法)等。
深度优先搜索是一种遍历图的算法,它从一个起始节点开始,沿着一条路径一直遍历到最后一个节点,然后回溯到前一个节点,继续遍历其他路径。
广度优先搜索则是从起始节点开始,逐层遍历图中的节点,直到找到目标节点。
最短路径算法用于计算图中两个节点之间的最短路径,它可以解决最短路径问题,如求解地图上的最短路径。
VB常用算法总结在VB(Visual Basic)编程中,常用的算法有很多。
下面将对其中一些常见和重要的算法进行总结。
请注意,由于篇幅限制,这只是一个简要总结,无法涵盖所有算法的细节。
1.排序算法:排序算法是计算机科学中最基本和常见的算法之一、在VB中,常用的排序算法包括冒泡排序、插入排序、选择排序、快速排序和归并排序等。
排序算法通过比较和交换来对一组数据进行重新排列,使其按照指定的顺序排列。
2.查找算法:查找算法用于在一个数据集中寻找特定的值或元素。
在VB中,常用的查找算法有二分查找和线性查找等。
二分查找是一种高效的算法,可以在有序数组中快速地找到目标元素。
3.图算法:图算法是用于解决与图相关的问题的算法。
在VB中,常用的图算法包括广度优先(BFS)和深度优先(DFS)等。
这些算法可以用于寻找图中的路径、检测环和遍历图等操作。
4.动态规划:动态规划是一种用于解决最优化问题的算法。
在VB中,常用的动态规划算法有背包问题、最长公共子序列和最短路径等。
动态规划算法通过拆解问题为子问题,并保存子问题的解来避免重复计算,从而提高算法的效率。
5.字符串匹配:字符串匹配算法用于在一个字符串中查找另一个字符串。
在VB中,常用的字符串匹配算法有暴力匹配算法、KMP算法和Boyer-Moore算法等。
这些算法通过比较字符来确定字符串的匹配位置。
6.线性代数:线性代数是数学的一个分支,用于解决线性方程组和向量空间等问题。
在VB中,常用的线性代数算法有矩阵运算、向量运算和线性方程求解等。
这些算法可以应用于计算机图形学、数据分析和机器学习等领域。
7.数学运算:数学运算在VB编程中非常常见。
常用的数学运算算法包括求和、平均值、最大值、最小值和中值等。
这些算法可以通过循环和条件判断来实现。
8.加密与解密:加密和解密算法用于保护数据的安全性。
在VB中,常用的加密算法有对称加密算法(如DES和AES)和非对称加密算法(如RSA和ECC)等。
数字大小排序数字是我们日常生活中常见的元素,我们经常需要对数字进行排序。
数字大小排序是将一组数字按照从小到大或从大到小的顺序排列的过程。
在本文中,我们将讨论数字大小排序的方法和技巧。
1. 升序排序升序排序指的是将一组数字按照从小到大的顺序排列。
下面是一些常用的升序排序方法:1.1 冒泡排序冒泡排序是一种简单的排序算法,它重复地遍历要排序的数字列表,一次比较两个相邻的元素,并根据需要交换它们的位置。
如果你需要对一组数字进行升序排序,可以使用以下步骤:- 从第一个数字开始,比较它与下一个数字的大小。
如果第一个数字比下一个数字大,交换它们的位置。
- 继续向后比较,直到你到达列表的末尾。
- 重复上述步骤,每次都将未排序的数字列表长度减少1,直到所有数字都排序完成。
1.2 插入排序插入排序是另一种常见的排序算法,它通过构建有序的列表,逐个向该列表插入未排序的数字来实现排序。
以下步骤可以帮助你进行升序排序:- 从第一个数字开始,将其视为已排序的列表。
- 继续向后遍历未排序的数字,将每个数字插入已排序列表中的适当位置。
插入时,需要将比待插入数字大的数字后移一位,为待插入数字腾出空间。
- 重复上述步骤,直到所有数字都被插入到已排序的列表中。
2. 降序排序降序排序指的是将一组数字按照从大到小的顺序排列。
下面介绍一些常用的降序排序方法:2.1 快速排序快速排序是一种常用的排序算法,它将一个大的数字列表分割成两个子列表,并对子列表递归地进行排序。
以下步骤可以帮助你进行降序排序:- 选择一个基准数字。
可以是列表中的任意一个数字。
- 将列表分成两个子列表,其中一个子列表的数字大于或等于基准数字,另一个子列表的数字小于基准数字。
- 对两个子列表递归地应用快速排序算法,直到每个子列表的长度为1或0。
- 合并排序后的子列表,以得到最终的降序排序结果。
2.2 选择排序选择排序是一种简单的排序算法,它每次从待排序的数字列表中选择最大的或最小的数字,并将其放置在已排序部分的末尾。
数字排序方法知识点总结数字排序是计算机科学中重要的基本操作之一。
它能够帮助我们从一系列数字中找到最大值、最小值,或者将数字按照升序或降序进行排列。
本文将介绍几种常见的数字排序方法,并总结它们的原理和应用场景。
一、冒泡排序(Bubble Sort)冒泡排序是最简单、最容易理解的排序算法之一。
它的原理在于多次遍历待排序的元素,每次比较相邻的两个元素,如果它们的顺序不对则交换它们的位置。
通过多次遍历,将较大(或较小)的元素逐渐“浮”到正确的位置上。
冒泡排序的时间复杂度为O(n^2),在处理小规模数据时表现良好,但对于大规模数据效率较低。
由于其简单的原理,冒泡排序适用于教学和理论研究,但在实际应用中往往采用更高效的排序算法。
二、选择排序(Selection Sort)选择排序是另一种简单直观的排序算法。
它的原理是每次从未排序的元素中选择最小(或最大)的元素,然后将其放置到已排序序列的末尾。
通过不断选择最值,从而逐步形成有序序列。
选择排序的时间复杂度也为O(n^2),与冒泡排序类似,它适用于小规模数据的排序。
然而,选择排序的交换次数比冒泡少,因此在实际应用中较为常见。
三、插入排序(Insertion Sort)插入排序的思想是将待排序序列分为已排序和未排序两部分,每次从未排序的部分选择一个元素,插入到已排序的部分的正确位置上。
它模拟了我们人类排序卡牌的方式,逐个将新的元素插入到已排序序列中。
插入排序的时间复杂度为O(n^2),但在实际应用中,它对于部分有序的数据或者小规模数据表现出色。
插入排序的一个优点是可以进行原地排序(in-place sorting),仅使用常量级的额外空间。
四、快速排序(Quick Sort)快速排序是一种高效的排序算法,其原理基于分治法(Divide and Conquer)。
它通过一趟排序将待排序序列分割成独立的两部分,其中一部分的所有元素都比另一部分的元素小(或大)。
然后递归地对两部分继续进行排序,最终达到整个序列有序的效果。
算法知识点常用算法的原理和应用算法是计算机科学中的重要基础,它是指解决问题的步骤和方法。
在计算机科学领域中,有许多常用的算法被广泛应用于各种任务和应用中。
本文将介绍一些常见的算法,包括它们的原理和应用。
一、排序算法排序算法是指将一组元素按照特定顺序排列的算法。
常见的排序算法有冒泡排序、插入排序、选择排序、快速排序和归并排序等。
1. 冒泡排序冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻的元素并交换位置,直到整个列表排序完毕。
冒泡排序的时间复杂度为O(n^2),适用于小规模的数据排序。
2. 插入排序插入排序是一种简单直观的排序算法,它通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序的时间复杂度也为O(n^2),但对于小规模的数据或近乎有序的数据排序,插入排序具有较好的性能。
3. 选择排序选择排序是一种简单直观的排序算法,它通过每次选择剩余元素中的最小值,并与剩余序列的第一个元素交换位置,直到整个序列排序完毕。
选择排序的时间复杂度为O(n^2),不论数据是否有序,其性能表现稳定。
4. 快速排序快速排序是一种高效的排序算法,它采用了分治的思想,通过每次选择一个基准元素,将序列分割成两部分,分别对左右子序列递归地进行排序。
快速排序的时间复杂度为O(nlogn),在大多数情况下具有较好的性能。
5. 归并排序归并排序是一种稳定的排序算法,它采用了分治的思想,将序列分成若干个子序列,分别进行排序,然后再将已排序的子序列合并成一个有序序列。
归并排序的时间复杂度为O(nlogn),但其空间复杂度较高。
二、查找算法查找算法是指在给定的数据集合中,寻找特定元素的算法。
常见的查找算法有线性查找、二分查找和哈希查找等。
1. 线性查找线性查找是一种简单直观的查找算法,它从数据集中的第一个元素开始逐个比较,直到找到目标元素或遍历完整个数据集。
线性查找的时间复杂度为O(n),适用于小规模的数据集。
数字大小排序数字在我们的日常生活中随处可见,我们经常需要对数字进行排序。
排序是一种重要的基本运算,能够将一组元素按照某种规则从小到大或从大到小进行排列。
在本文中,我们将探讨几种常用的数字大小排序方法。
1. 冒泡排序法冒泡排序法是最简单、最常用的排序算法之一。
它的基本思想是从待排序的元素序列的起始位置开始,两两比较相邻的元素,根据大小进行交换,直到最后一个元素。
通过多次遍历,将最大的元素“冒泡”到序列的末尾。
该算法的时间复杂度为O(n^2)。
2. 快速排序法快速排序法是一种高效的排序算法,它的基本思想是通过选择一个基准元素,将序列分割成左右两部分,左边的元素比基准元素小,右边的元素比基准元素大。
然后递归地对左右两部分进行排序,直到整个序列有序。
快速排序的时间复杂度为O(nlogn)。
3. 选择排序法选择排序法是一种简单直观的排序算法,它的基本思想是从待排序的元素序列中选择最小的元素,将其放在序列的起始位置,然后在剩余的元素中再选择最小的元素,放在已排序序列的末尾。
通过多次遍历和选择,依次将最小的元素放在正确的位置。
选择排序的时间复杂度也为O(n^2)。
4. 插入排序法插入排序法是一种简单直观的排序算法,它的基本思想是将待排序的元素逐个插入已排序序列的正确位置,直到整个序列有序。
在插入过程中,需要不断地比较和移动元素,以确定插入的位置。
插入排序的时间复杂度为O(n^2)。
5. 归并排序法归并排序法是一种分治策略的排序算法,它将待排序的序列分成若干个子序列,对每个子序列进行排序,然后再将排好序的子序列合并,直到整个序列有序。
归并排序的时间复杂度为O(nlogn)。
通过以上几种方法,可以实现对数字大小的排序。
在实际应用中,我们根据具体的情况选择合适的排序算法,并根据算法的特点进行优化,以提高排序的效率。
总结起来,数字大小排序是一项重要的任务。
通过合适的排序算法,我们能够将一组数字按照从小到大或从大到小的顺序排列。
常见排序算法总结 虽然现有的开发组件中对排序算法已经有很好的实现,但是通过研究这些算法的思路,对我们思维能力的提高还是很有帮助的,以下都以升序为例,总结如下。
1.冒泡排序,最简单也最常用的一种(^_^不复习的情况下,笔试遇到排序问题,我只能记住它),思想是:每次将数组前N个中最大(升序)或最小(降序)的数交换到数组底部,每次数组大小N--,再进行如此操作,直到所有的数都已排序即N=1。这样循环比较的次数是(n-1)+(n-2)+(n-3)....... 约等于(n)(n+1)/2, 时间复杂度为O(n2),N的平方。C语言实现如下:
void bubble_sort(int *array, int size) { int i, j, temp; for (i=size-1; i>1; i--) for (j=0; jif (array[j] > array[j+1]) { temp = array[j+1]; array[j+1] = array[j]; array[j] = temp; } }
2.交换排序,原理是用第一个元素和第二个元素比较,若第一个元素大于第二个,则交换,交换后第一个元素在与第三个元素比较.....直到N个元素,然后再选择第二个元素和第三个元素比较,进行同样操作.....直到选择到N个元素。这样操作完成后数组就变为升序了。其实说白了,原理就是第一次交换,确保第一个元素是最小的,第二次交换确保第二个元素是第二小的.... 以此类推。效率也很低,循环次数(n-1)(n-2)..即O(n2), n的平方,C语言实现如下:
void change_sort(int *array, int size) { int i, j, temp; for (i=0; ifor (j=i+1; jif (array[i]>array[j]){ temp = array[j]; array[j] = array[i]; array[i] = temp; } }
3.选择排序,仔细看交换排序,发现其实没必要每次发现比自己小的元素就发生交换,只要和剩下的元素中最小的那个元素交换就可以了,即选择最小的元素进行交换,那么交换排序的扩展算法,选择排序就很容易得出来了,效率略比交换排序高,整体平均效率还是N的平方,C语言实现如下:
void select_sort(int *array, int size) { int i, j, temp, pos; for (i=0; ifor (j=i+1, temp=array[i], pos=i; jif (temp > array[j]) { temp = array[j]; pos = j; } array[pos] = array[i]; array[i] = temp; } }
4.插入排序,有点类似冒泡排序的逆操作,也是比较简单易懂的算法。原理是,现对数组第一个和第二个排序,这样前2个元素就是有序的了,再引入第三个元素,找到合适的位置插入。。。以此插入剩余元素。这种排序算法比起冒泡排序算法效率更高,有点类似冒泡排序的改进算法。虽然效率上比冒泡排序好,但是也是一种简单排序算法,循环次数为 1+2+3...+n-1,即n(n+1)/2, 平均情况下时间复杂度还是O(n2),n的平方。C语言实现如下:
void insert_sort(int *array, int size) { int i, j, temp; for (i=1; ifor (j=i, temp=array[i]; j>0&&temparray[j] = array[j-1]; array[j] = temp; } }
小结,以上四种排序算法是常见的四种简单排序算法,其中选择排序比较像我们人对一副扑克牌排序一样,先选出最小的,然后选出次小的,以此类推。而且选择排序算是这四种算法中效率比较稳定的,虽然这四种简单排序的时间复杂度都趋近O(n2),下面我们介绍几种高级排序算法。 5.希尔排序,在所有这些排序算法中,唯一以人名命名的算法就是希尔排序(Donald shell),可见这个排序算法是比较特别的。很少有人能理解这个算法的原理并且证明它(^_^俺也不懂,好像证明过程很复杂,需要很强的数学功底),而且现在已经有更加快速的算法取代它了,深入研究也就没那么重要了。其思想是,避免大量的数据移动(即交换),每次对H1个序列进行插入排序,然后计算出一个增量K1,对连续的H2=K+H1个序列进行插入排序,重复计算增量K2,再对H3=H2+K2进行插入排序......因为我们知道,每次插入排序之后,这个序列就是有序序列了,在扩大这个序列进行排序的时候,需要移动的元素就少了,这样就能获得比插入排序更加高效的算法来。经过shell大人的证明,这个算法的时间复杂度小于O(N2),所以也被叫做亚二次方算法。第一次选择的序列为N/2,即后一半元素,每次计算增量的参考值用的是2.2(资料上说是没有理论基础,但是经过实际检验,估计是后来出现更优的算法,也就少有人去研究证明了吧^_^),C语言编码如下: void shell_sort(int *array, int size) { int gap, i, j,temp; for (gap = size/2; gap>0; gap=(gap == 2 ?1:(int)(gap/2.2)) ) for (i=gap; ifor (j=i,temp=array[i];j>=gap && temp < array[j-gap]; j=j-gap) array[j] = array[j-gap]; array[j] = temp; } }
6.归并排序,采用的是分治算法,即将一组元素通过几次平分,分成若干组元素(最终单个元素为一组),这样 就形成一个满二叉树形结构,叶子节点为单个元素,归属于同一父节点的两组元素排序后归并成一组元素,最终归属于根节点的两组元素再归并成一组元素,完成排 序。这是典型的分治算法,如能理解分治算法的含义,那么也不难理解归并排序。这个算法的缺点是需要借助于排序元素相同大小的辅助数组,而且需要将数据反复 的在原始数组和辅助数组之间拷贝,这些额外的工作大大降低了此算法的工作效率,时间复杂度为O(NlogN),C编码如下: void merge(int *array, int *temp_array, int left, int right, int right_end) { int left_end = right - 1, i; int tmp = left; int num = right_end - left+1;
while (left <= left_end && right <= right_end) if (array[left] <= array[right]) temp_array[tmp++] = array[left++]; else temp_array[tmp++] = array[right++];
while (left <= left_end) temp_array[tmp++] = array[left++]; while (right <= right_end) temp_array[tmp++] = array[right++]; for (i=0; iarray[right_end] = temp_array[right_end]; }
void m_sort(int *array, int *temp_array, int left, int right) { int center; if (left < right) { center = (left+right)/2; m_sort(array, temp_array, left, center); m_sort(array, temp_array, center+1, right); merge(array, temp_array, left, center+1, right); } } void merge_sort(int *array, int size) { int *temp = (int*)malloc(size); memset(temp, 0, size); m_sort(array, temp, 0, size-1); free(temp); }
7.快速排序.实际应用中用的最多的,也是最常见的一种排序方法,其主要思想还是用了分治法,算法是,从数 组中找到一个支点,通过交换,使得支点的左边都是小于支点的元素,支点的右边都是大于支点的元素,而支点本身所处的位置就是排序后的位置!然后把支点左边 和支点右边的元素看成两个子数组,再进行如上支点操作直到所有元素有序!这是基本的算法思想,各种不同的实现可能和支点的选择有关,最简单的是选择第一个 元素做支点,常用的是选择中间的元素做支点,而本文的实现代码是第一个元素,中间元素,最后一个元素,这三个元素的中值即满足(a素和中间元素更加合理。实现代码如下: void swap(int *a, int *b) //交换函数 { int temp = *a; *a = *b; *b = temp; }
int partition(int *array, int low, int high) { int middle = (low+high)/2, temp, pivot,i,j; //选择第一个元素,最后一个元素,中间元素中的中间值作为支点
if (array[middle] < array[low]) swap(&array[middle], &array[low]); if (array[high] < array[low])