排序算法的比较、选择及其改进
排序算法比较

排序算法比较
排序算法的效率主要取决于算法的时间复杂度。
以下是常见的几种排序算法的时间复杂度和优缺点的对比:
1. 冒泡排序
冒泡排序的时间复杂度为O(n^2)。
优点是它的实现简单易懂,缺点是排序速度很慢,对大规模数据排序不太适用。
2. 插入排序
插入排序的时间复杂度也为 O(n^2)。
它的优点是适用于小数
据量的排序,缺点是对于大规模数据排序仍然效率不高。
3. 选择排序
选择排序的时间复杂度也为 O(n^2)。
它的优点是对于小数据
量的排序速度较快,但是因为其算法结构固定,所以其效率在大规模数据排序中表现不佳。
4. 快速排序
快速排序的时间复杂度为 O(nlogn)。
它是一种非常常用的排序算法,适用于大规模数据排序。
快速排序的优点在于分治的思想,可以充分发挥多线程并行计算的优势,缺点是在极端情况下(如输入的数据已经有序或者逆序)排序速度会较慢。
5. 堆排序
堆排序的时间复杂度为 O(nlogn)。
它的优点在于实现简单、稳定,可以用于实时系统中的排序。
缺点是在排序过程中需要使用一个堆结构来维护排序序列,需要额外的内存开销。
同时,由于堆的性质,堆排序不能发挥多线程并行计算的优势。
6. 归并排序
归并排序的时间复杂度为 O(nlogn)。
它的优点在于稳定、可靠,效率在大规模数据排序中表现良好。
归并排序在实现过程中需要使用递归调用,需要额外的内存开销。
同时,归并排序不适用于链式存储结构。
十大经典排序算法总结

⼗⼤经典排序算法总结最近⼏天在研究算法,将⼏种排序算法整理了⼀下,便于对这些排序算法进⾏⽐较,若有错误的地⽅,还请⼤家指正0、排序算法说明0.1 排序术语稳定:如果a=b,且a原本排在b前⾯,排序之后a仍排在b的前⾯不稳定:如果a=b,且a原本排在b前⾯,排序之后排在b的后⾯时间复杂度:⼀个算法执⾏所耗费的时间空间复杂度:⼀个算法执⾏完所需内存的⼤⼩内排序:所有排序操作都在内存中完成外排序:由于数据太⼤,因此把数据放在磁盘中,⽽排序通过磁盘和内存的数据传输才能进⾏0.2算法时间复杂度、空间复杂度⽐较0.3名词解释n:数据规模k:桶的个数In-place:占⽤常数内存,不占⽤额外内存Out-place:占⽤额外内存0.4算法分类1.冒泡排序冒泡排序是⼀种简单的排序算法。
它重复地⾛访过要排序的数列,⼀次⽐较两个元素,如果它们的顺序错误就把它们交换过来。
⾛访数列的⼯作是重复地进⾏直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越⼩的元素会经由交换慢慢“浮”到数列的顶端1.1算法描述⽐较相邻的元素,如果前⼀个⽐后⼀个打,就交换对每⼀对相邻元素做同样的⼯作,从开始第⼀对到结尾最后⼀对,这样在最后的元素应该会是最⼤的数针对所有的元素重复以上的步骤,除了最后⼀个重复步骤1-3,知道排序完成1.2动图演⽰1.3代码实现public static int[] bubbleSort(int[] array) {if (array.length == 0)return array;for (int i = 0; i < array.length; i++)for (int j = 0; j < array.length - 1 - i; j++)if (array[j + 1] < array[j]) {int temp = array[j + 1];array[j + 1] = array[j];array[j] = temp;}return array;}1.4算法分析最佳情况:T(n) = O(n) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2)2.选择排序表现简单直观的最稳定的排序算法之⼀,因为⽆论什么数据都是O(n2)的时间复杂度,⾸先在未排序序列中找到最⼩(⼤)元素,与数组中第⼀个元素交换位置,作为排序序列的起始位置,然后再从剩余未排序元素中继续寻找最⼩(⼤)的元素,与数组中的下⼀个元素交换位置,也就是放在已排序序列的末尾2.1算法描述1.初始状态:⽆序区为R[1..n],有序区为空2.第i躺排序开始时,当前有序区和⽆序区R[1..i-1]、R[i..n]3.n-1趟结束,数组有序化2.2动图演⽰2.3代码实现public static int[] selectionSort(int[] array) {if (array.length == 0)return array;for (int i = 0; i < array.length; i++) {int minIndex = i;for (int j = i; j < array.length; j++) {if (array[j] < array[minIndex]) //找到最⼩的数minIndex = j; //将最⼩数的索引保存}int temp = array[minIndex];array[minIndex] = array[i];array[i] = temp;}return array;}2.4算法分析最佳情况:T(n) = O(n2) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2)3、插⼊排序是⼀种简单直观的排序算法,通过构建有序序列,对于未排序序列,在已排序序列中从后向前扫描,找到相应位置并插⼊,需要反复把已排序元素逐步向后挪位,为最新元素腾出插⼊空间3.1算法描述1.从第⼀个元素开始,该元素可以认为已经被排序2.取出下⼀个元素(h),在已排序的元素序列中从后往前扫描3.如果当前元素⼤于h,将当前元素移到下⼀位置4.重复步骤3,直到找到已排序的元素⼩于等于h的位置5.将h插⼊到该位置6.重复步骤2-53.2动图演⽰3.3代码实现public static int[] insertionSort(int[] array) {if (array.length == 0)return array;int current;for (int i = 0; i < array.length - 1; i++) {current = array[i + 1];int preIndex = i;while (preIndex >= 0 && current < array[preIndex]) {array[preIndex + 1] = array[preIndex];preIndex--;}array[preIndex + 1] = current;}return array;}3.4算法分析最佳情况:T(n) = O(n) 最坏情况:T(n) = O(n2) 平均情况:T(n) = O(n2)4、希尔排序是简单插⼊排序经过改进之后的⼀个更⾼效的版本,也称为缩⼩增量排序,同时该算法是冲破O(n2)的第⼀批算法之⼀。
比较冒泡算法,选择算法,希尔排序算法

一、算法简介冒泡排序算法、选择排序算法和希尔排序算法是三种常用的排序算法。
这三种算法的共同点是都属于比较排序算法,即通过比较元素之间的大小,进行排序。
下面将分别对这三种算法进行介绍。
二、冒泡排序算法冒泡排序算法的基本思想是对相邻的元素进行比较,如果逆序则交换它们的位置,直到整个序列有序为止。
具体实现过程如下:1. 设置循环次数为 n-1,n 为待排序序列长度。
2. 对于每一次循环,从第一个元素开始,依次比较相邻的两个元素,如果逆序则交换它们的位置。
3. 每一次循环结束后,待排序序列中最大的元素就会被排到末尾。
4. 重复执行上述步骤,直到整个序列有序。
冒泡排序算法的时间复杂度为 O(n^2),空间复杂度为 O(1),稳定性较好,适用于数据量较小的情况。
三、选择排序算法选择排序算法的基本思想是从待排序序列中选择最小的元素,放到已排序序列的末尾,直到整个序列有序为止。
具体实现过程如下:1. 设置循环次数为 n-1,n 为待排序序列长度。
2. 对于每一次循环,从第一个元素开始,找到待排序序列中最小的元素,并将其放到已排序序列的末尾。
3. 重复执行上述步骤,直到整个序列有序。
选择排序算法的时间复杂度为 O(n^2),空间复杂度为 O(1),稳定性较差,适用于数据量较小的情况。
四、希尔排序算法希尔排序算法也称为缩小增量排序算法,是插入排序算法的一种改进。
希尔排序算法的基本思想是将待排序序列分成若干个子序列,对每个子序列进行插入排序,然后再对整个序列进行一次插入排序,直到整个序列有序为止。
具体实现过程如下:1. 设置一个增量值 gap,将待排序序列分成若干个子序列,每个子序列包含的元素个数为 gap。
2. 对于每个子序列,进行插入排序。
3. 减小增量值 gap,重复执行上述步骤,直到 gap=1。
4. 对整个序列进行一次插入排序,使得序列有序。
希尔排序算法的时间复杂度为 O(n^2),空间复杂度为 O(1),稳定性较差,适用于数据量较大的情况。
各种排序算法的总结和比较

各种排序算法的总结和比较1 快速排序(QuickSort )快速排序是一个就地排序,分而治之,大规模递归的算法。
从本质上来说,它是归并排序的就地版本。
快速排序可以由下面四步组成。
(1 )如果不多于1 个数据,直接返回。
(2 )一般选择序列最左边的值作为支点数据。
(3 )将序列分成2 部分,一部分都大于支点数据,另外一部分都小于支点数据。
(4 )对两边利用递归排序数列。
快速排序比大部分排序算法都要快。
尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。
快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。
2 归并排序(MergeSort )归并排序先分解要排序的序列,从1 分成2 ,2 分成4 ,依次分解,当分解到只有1 个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。
合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。
3 堆排序( HeapSort )堆排序适合于数据量非常大的场合(百万数据)。
堆排序不需要大量的递归或者多维的暂存数组。
这对于数据量非常巨大的序列是合适的。
比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。
堆排序会将所有的数据建成一个堆,最大的数据在堆顶,然后将堆顶数据和序列的最后一个数据交换。
接下来再次重建堆,交换数据,依次下去,就可以排序所有的数据。
4 Shell 排序( ShellSort )Shell 排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。
平均效率是O(nlogn) 。
其中分组的合理性会对算法产生重要的影响。
现在多用D.E.Knuth 的分组方法。
Shell 排序比冒泡排序快5 倍,比插入排序大致快2 倍。
Shell 排序比起QuickSort ,MergeSort ,HeapSort 慢很多。
排序算法十大经典方法

排序算法十大经典方法
排序算法是计算机科学中的经典问题之一,它们用于将一组元素按照一定规则排序。
以下是十大经典排序算法:
1. 冒泡排序:比较相邻元素并交换,每一轮将最大的元素移动到最后。
2. 选择排序:每一轮选出未排序部分中最小的元素,并将其放在已排序部分的末尾。
3. 插入排序:将未排序部分的第一个元素插入到已排序部分的合适位置。
4. 希尔排序:改进的插入排序,将数据分组排序,最终合并排序。
5. 归并排序:将序列拆分成子序列,分别排序后合并,递归完成。
6. 快速排序:选定一个基准值,将小于基准值的元素放在左边,大于基准值的元素放在右边,递归排序。
7. 堆排序:将序列构建成一个堆,然后一次将堆顶元素取出并调整堆。
8. 计数排序:统计每个元素出现的次数,再按照元素大小输出。
9. 桶排序:将数据分到一个或多个桶中,对每个桶进行排序,最后输出。
10. 基数排序:按照元素的位数从低到高进行排序,每次排序只考虑一位。
以上是十大经典排序算法,每个算法都有其优缺点和适用场景,选择合适的算法可以提高排序效率。
简单排序算法

简单排序算法排序算法是计算机科学中最基本、最常用的算法之一。
通过对原始数据集合进行排序,可以更方便地进行搜索、统计、查找等操作。
常用的排序算法有冒泡排序、选择排序、插入排序等。
本文将介绍这些简单排序算法的具体实现及其优缺点。
一、冒泡排序(Bubble Sort)冒泡排序是一种基础的交换排序算法。
它通过不断地交换相邻的元素,从而将数据集合逐渐排序。
具体实现步骤如下:1.比较相邻的元素。
如果第一个比第二个大,就交换它们两个;2.对每一对相邻元素做同样的工作,从第一对到最后一对,这样一轮排序后,就可以确保最后一个元素是最大的元素;3.针对所有元素重复以上的步骤,除了最后一个;4.重复步骤1~3,直到排序完成。
冒泡排序的优点是实现简单、容易理解。
缺点是排序效率较低,尤其是对于较大的数据集合,时间复杂度为O(n²)。
二、选择排序(Selection Sort)选择排序是一种基础的选择排序算法。
它通过在数据集合中选择最小的元素,并将其放置到最前面的位置,然后再从剩余元素中选出最小的元素,放置到已排序部分的末尾。
具体实现步骤如下:1.在未排序序列中找到最小元素,存放到排序序列的起始位置;2.再从剩余未排序元素中继续寻找最小元素,放到排序序列末尾;3.重复步骤1~2,直到排序完成。
选择排序的优点是实现简单、固定时间复杂度O(n²)。
缺点是排序效率仍然较低,尤其是对于大数据集合,因为每次只能交换一个元素,所以相对于冒泡排序,它的移动次数固定。
三、插入排序(Insertion Sort)插入排序是一种基础的插入排序算法。
它将未排序的元素一个一个插入到已排序部分的正确位置。
具体实现步骤如下:1.从第一个元素开始,该元素可以认为已经被排序;2.取出下一个元素,在已经排序的元素序列中从后往前扫描;3.如果该元素(已排序)大于新元素,将该元素移到下一位置;4.重复步骤3,直到找到已排序的元素小于或等于新元素的位置;5.将新元素插入到该位置后;6.重复步骤2~5,直到排序完成。
选择排序算法优化方法
选择排序算法优化方法选择排序是一种简单但效率较低的排序算法,它的时间复杂度为O(n^2)。
在实际应用中,我们可以通过一些优化方法来提高选择排序的性能。
一、减少交换次数在选择排序中,每次找到最小元素后都会将其与当前位置进行交换。
如果经过比较后发现最小元素就是当前位置的元素,那么就没有必要进行交换操作。
我们可以通过设置一个标记来记录最小元素的下标,最后再进行一次交换操作,从而减少交换的次数。
二、减少比较次数在选择排序的过程中,每次找到最小元素后都需要与其他元素进行比较。
我们可以通过记录最小元素的下标,然后直接与最后一个元素进行交换,这样可以减少比较的次数。
三、使用二元选择排序在传统的选择排序中,每次都需要找到最小元素和最大元素,然后分别进行交换。
而在二元选择排序中,我们每次找到最小元素和最大元素后,可以同时进行交换,从而减少了交换的次数。
四、使用堆排序堆排序是一种高效的排序算法,可以在O(nlogn)的时间复杂度下完成排序。
在堆排序中,我们可以使用堆数据结构来进行选择操作。
通过建立最小堆或最大堆,每次从堆中取出根节点,即为最小或最大元素,然后进行交换。
这样可以减少比较和交换的次数。
五、使用插入排序的思想在选择排序中,每次找到最小元素后都需要进行交换操作。
我们可以使用插入排序的思想,将最小元素插入到已排序序列的合适位置,而不是直接进行交换。
这样可以减少交换的次数,提高排序的效率。
六、使用并行化技术在现代计算机中,我们可以使用并行化技术来加速排序算法的执行。
在选择排序中,我们可以将待排序序列分成多个子序列,然后分别进行选择排序操作。
最后再将子序列合并成一个有序序列。
通过并行化技术,可以同时进行多个选择操作,从而提高选择排序的效率。
七、使用优先队列优先队列是一种特殊的队列,可以根据元素的优先级进行插入和删除操作。
在选择排序中,我们可以使用优先队列来存储待排序的元素。
每次从优先队列中取出最小元素,即为选择排序的结果。
十大经典排序法
十大经典排序法
1. 冒泡排序(Bubble Sort):通过不断比较相邻元素并交换位置来排序,每一轮将最大的元素冒泡到最后。
2. 选择排序(Selection Sort):通过找到当前未排序部分的最小元素,将其放置到已排序部分的末尾,逐步构建有序序列。
3. 插入排序(Insertion Sort):将未排序元素逐个插入到已排序部分的正确位置,从而逐步构建有序序列。
4. 希尔排序(Shell Sort):是插入排序的改进版本,通过比较相隔一定间隔的元素进行排序,逐渐缩小间隔直至为1。
5. 归并排序(Merge Sort):采用分治策略,将待排序序列不断拆分为子序列,然后将子序列排序并合并得到最终有序序列。
6. 快速排序(Quick Sort):也是采用分治策略,通过选择一个基准元素将序列划分为左右两部分,分别对两部分进行排序。
7. 堆排序(Heap Sort):利用二叉堆的性质来进行排序,将待排序元素构建成最大(最小)堆,然后依次取出堆顶元素并调整堆结构。
8. 计数排序(Counting Sort):适用于元素值范围较小的情况,通过统计元素出现的次数,然后根据统计结果得到有序序列。
9. 桶排序(Bucket Sort):将元素根据大小分配到不同的桶中,每个桶内部再分别进行排序,最后将各个桶中的元素合并得到有序序列。
10. 基数排序(Radix Sort):将待排序元素按照位数进行排序,先按个位排序,再按十位排序,依此类推,直到最高位排序完成。
排序算法分析和比较
一、设计思想排序是数据处理中使用频率很高的一种操作,是数据查询之前需要进行的一项基础操作。
它是将任意序列的数据元素(或记录)按关键字有序(升序或降序)重新排列的过程。
排序的过程中有两种基本操作:一是比较两个关键字的值;二是根据比较结果移动记录位置。
排序的算法有很多种,这里仅对插入排序、选择排序、希尔排序、归并排序和快速排序作了比较。
直接插入排序算法基本思路:直接插入排序时将一个元素插入已排好的有序数组中,从而得到一个元素个数增加1的新的有序数组。
其具体实现过程是,将第i个元素与已经排好序的i-1个元素依次进行比较,再将所有大于第i个元素的元素后移一个位置,直到遇到小于或等于第i个元素,此时该元素的后面一个位置为空,将i元素插入此空位即可。
选择排序算法基本思路:定义两个数组sela[]和temp[],sela[]用来存放待排序数组,temp[]用来存放排好序的数组。
第一趟,将sela[]数组中n个元素进行比较,找出其中最小的元素放入temp[]的第一个位置,同时将sela[]中将该元素位置设置为无穷大。
第二趟,将sela[]数组中n个元素进行比较,找出其中最小的元素放入temp[]的第二个位置,同时将sela[]中将该元素位置设置为无穷大。
以此类推,n趟后将sela[]中所有元素都已排好序放入temp[]数组中。
希尔排序算法基本思路:希尔排序又称为变长步径排序,它也是一种基于插入排序的思想。
其基本思路是,定义一个步长数组gaps[1,5,13,43……],先选取合适的大步长gap将整个待排序的元素按步长gap分成若干子序列,第一个子序列的元素为a[0]、a[0+gap]、a[0+2gap]……a[0+k*gap];第二列为a[1]、a[1+gap]、a[1+2gap]……a[1+k*gap];……。
然后,对这些子序列分别进行插入排序,然后将gap按gaps[]数组中的步长缩小,按缩小后的步长再进行子序列划分排序,再减小步长直到步长为1为止。
搜索引擎的排序算法分析与优化建议
搜索引擎的排序算法分析与优化建议近年来,随着互联网的快速发展,搜索引擎已成为人们获取信息的主要方式。
搜索引擎的排序算法在其中起着关键作用,它决定了用户搜索结果的排序顺序。
本文将对搜索引擎的排序算法进行分析,并提出一些建议来优化这些算法。
一、搜索引擎排序算法的分析搜索引擎的排序算法主要包括传统的PageRank算法、基于内容的排序算法和机器学习算法。
这些算法有各自的优势和局限性。
1. 传统的PageRank算法传统的PageRank算法是通过计算网页之间的链接关系来评估网页的重要性,然后根据重要性对搜索结果进行排序。
这种算法的优点是简单有效,可以很好地衡量网页的权威性。
然而,它容易被人为操纵,例如通过人工增加链接数量来提高网页的排名。
同时,该算法忽略了网页内容的质量和相关性。
2. 基于内容的排序算法基于内容的排序算法是根据用户的搜索关键词,匹配网页的内容来进行排序。
它考虑了网页的相关性和质量,可以提供更准确的搜索结果。
然而,该算法容易受到关键词的干扰,例如同义词的使用和关键词的滥用。
而且,这种算法对于新兴或少知名的网页往往无法准确判断其质量和相关性。
3. 机器学习算法机器学习算法是近年来蓬勃发展的一种算法,它通过分析用户搜索行为和网页特征,自动优化搜索结果的排序。
这种算法可以不断学习和调整,逐渐提升搜索结果的质量。
然而,机器学习算法需要大量的数据支持和运算资源,在处理大规模数据时效率较低。
二、搜索引擎排序算法的优化建议针对搜索引擎排序算法存在的问题,提出以下优化建议:1. 整合多个算法应综合利用传统的PageRank算法、基于内容的排序算法和机器学习算法的优势,构建一个综合、全面的排序算法。
通过结合不同算法的结果,可以提高搜索结果的准确性和相关性。
2. 引入用户反馈用户反馈是改进搜索引擎排序算法的重要信息源。
引入用户反馈,例如用户点击行为和搜索结果评分,可以不断优化排序算法,提供更符合用户需求的搜索结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
排序算法的比较、选择及其改进
[摘要]排序是计算机科学中最重要的研究问题之一。
在对常用的几种排序算法进行了综合比较的基础上,本文提出了在实际应用中如何选择排序算法的一般原则,同时也给出了一些算法的改进策略及其C语言实现。
[关键词]排序改进比较选择算法
一、引言
排序是计算机科学中最重要的研究问题之一, 它在计算机图形、计算机辅助设计、机器人、模式识别及统计学等领域具有广泛的应用。
由于它固有的理论上的重要性,2000年它被列为对科学和工程计算的研究与实践影响最大的10大问题之一。
其功能是将一个数据元素的任意序列重新排列成一个按关键字有序的序列。
二、排序算法的性能比较
内部排序算法种类繁多,但就其排序时所遵循的原则而言,大致可分为五大类:插入排序、交换排序、选择排序、归并排序和基数排序。
算法性能的比较主要是从时间复杂度、空间复杂度和稳定性三个方面来综合考虑。
(一)时间复杂度
从平均性能上看,直接插入排序、简单选择排序、冒泡排序这三种“简单排序”为第一类,其时间复杂度均为O(n2);堆排序、归并排序、快速排序属于第二类,其时间复杂度均为O(nlog2n);基数排序则属于第三类,其时间复杂度为O(d(n+rd)),也可以写为O(dn),因此最适用于n值很大而关键字较小的序列。
当原表有序或基本有序时,直接插入排序和冒泡排序将大大减少比较次数和移动记录的次数,时间复杂度可降至O(n);而快速排序则相反,当原表基本有序时,将蜕化为冒泡排序,时间复杂度提高为O(n2);原表是否有序,对简单选择排序、堆排序、归并排序和基数排序的时间复杂度影响不大。
(二)空间复杂度
从空间复杂度来看,归并排序最大,对n 个记录需要附加等量的存储量,其空间复杂度为O(n);基数排序次之,它需要附加较多存储空间用于存储队列指针和用作结点指针域,空间复杂度为O(rd);快速排序单独讨论,其递归算法需要使用堆栈来实现,栈中存放待排序记录序列的首尾位置,在一般情况下需要栈空间O(nlog2n),最坏情况下,所需要的栈空间为O(n);其余排序算法
的空间复杂度最小,仅为O(1)。
(三)稳定性
从算法的稳定性而言,所有排序算法可分为两类:直接插入排序、简单选择排序、冒泡排序、归并排序和基数排序为第一类,均属于稳定的算法,而快速排序和堆排序则属于第二类,是不稳定算法。
三、排序算法的选择
根据以上的性能比较,我们发现每种排序算法都各有优缺点。
因此,在实用时需根据不同情况适当选用,甚至可以将多种方法结合起来使用。
(一)选择排序算法的依据
影响排序的因素有很多,平均时间复杂度低的算法并不一定就是最优的。
相反,有时平均时间复杂度高的算法可能更适合某些特殊情况。
同时,选择算法时还得考虑它的可读性,以利于软件的维护。
一般而言,需要考虑的因素有以下四点:
1.待排序的记录数目n的大小;
2.记录本身数据量的大小,也就是记录中除关键字外的其他信息量的大小;
3.关键字的结构及其分布情况;
4.对排序稳定性的要求。
(二)选择排序算法的结论
依据上述在选择排序算法时需考虑的因素,可以得出以下几个结论:
1.数据量不大时选用插入或选择排序,一般不使用或不直接使用传统的冒泡排序;
2.当数据量大而又注重空间复杂性时选择快速排序或堆排序等;
3.在已排序数据上增加若干新数据时,建议使用插入排序;
4.当数据量大而又允许使用较多附加空间时可选择桶排序。
四、一些排序算法的改进策略
常用的排序算法中,有不少是可以根据实际情况而进一步改进完善的,以充
分提高算法的效率。
(一)简单选择排序的改进二元选择排序
传统的简单选择排序,每趟循环只能确定一个元素排序后的定位。
我们可以考虑改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数。
改进后对n个数据进行排序,最多只需进行[n/2]趟循环即可。
具体实现如下:
void SelectSort(RecType r[ ],int n) {
/* 本文中RecType为记录类型,下同*/
int i ,j , min ,max;
for (i=1 ;i r[max].key)
{ max = j ; continue ; }
if (r[j].key 1) {
pos= 0; /*每趟开始时, 无记录交换*/
for (j= 1; j r[j+1].key) {
pos= j; /*记录交换的位置*/
r[0]= r[j];r[j]=r[j+1];r[j+1]=r[0];
} /* end of if */
i= pos; /*为下一趟排序作准备*/
} /* end of while */
}/* end of Bubble_1 */
2.传统冒泡排序中每一趟排序操作只能找一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。
改进后的算法实现为:
void Bubble_2 ( RecType r[ ], int n){
low = 1; high= n; /*置变量的初始值*/ while (low < high) {
for ( j= low; j< high; j+ + )
/*正向冒泡, 找到最大者*/。