大数据结构:简单选择,直接插入,快速排序,冒泡排序希尔排序,堆排序算法比较平台

合集下载

数据排序的方法

数据排序的方法

数据排序的方法
1. 冒泡排序:通过多次遍历数组,依次比较相邻的两个元素并交换位置,将最大(或最小)的元素逐渐冒泡至数组的一端。

2. 插入排序:将数组分为已排序和未排序两部分,依次将未排序部分的元素插入到
已排序部分的合适位置,使得已排序部分一直保持有序。

3. 选择排序:每次从未排序部分选出最大(或最小)的元素,放到已排序部分的末尾,直到未排序部分为空。

4. 归并排序:将数组分为若干个小部分,对每个小部分进行排序,然后再合并这些
有序小部分,直至整个数组有序。

5. 快速排序:通过选择一个基准元素,将数组分为小于基准和大于基准的两部分,
然后递归对这两部分进行排序。

6. 堆排序:将数组看作是一个完全二叉树,通过调整树的结构使得每个节点的值都
大于等于其子节点(大顶堆)或小于等于其子节点(小顶堆),然后逐个取出根节点得到
排序结果。

7. 希尔排序:对数组进行间隔分组,对每个分组进行插入排序,然后逐渐缩小间隔
直至1,最终进行一次插入排序。

8. 计数排序:统计数组中每个元素出现的次数,然后根据元素值的顺序将元素依次
放入结果数组。

9. 桶排序:将数组划分为若干个桶,根据元素的大小把元素放入相应的桶中,然后
再对每个桶中的元素进行排序,最后将所有桶中的元素依次放入结果数组。

10. 基数排序:按照元素的每一位进行排序,从低位到高位逐步稳定。

这些排序方法有各自的优缺点,适用于不同的数据特点和应用场景。

在实际应用中需
要根据具体情况选择合适的排序方法。

数据结构最基础的十大算法

数据结构最基础的十大算法

数据结构最基础的十大算法数据结构是计算机科学中的重要分支,它研究如何组织和存储数据以便于访问和修改。

在数据结构中,算法是解决问题的关键。

下面将介绍数据结构中最基础的十大算法。

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. 设置循环次数为 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),稳定性较差,适用于数据量较大的情况。

java常用算法和数据结构

java常用算法和数据结构

java常用算法和数据结构Java是一种面向对象的编程语言,它具有丰富的算法库和数据结构库,为开发人员提供了许多常用的算法和数据结构。

下面将介绍一些Java常用的算法和数据结构。

1.排序算法-冒泡排序(Bubble Sort):比较相邻的两个元素,如果顺序错误则交换位置,重复该过程直到整个序列有序。

-插入排序(Insertion Sort):将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分合适的位置。

-选择排序(Selection Sort):每次从未排序部分选择最小(或最大)的元素,放到已排序部分的末尾。

-快速排序(Quick Sort):选择一个基准元素,将数组分为两部分,小于基准的放左边,大于基准的放右边,递归地对左右两部分进行快速排序。

-归并排序(Merge Sort):将数组分为两部分,分别对每个子数组进行排序,然后合并两个有序子数组。

2.搜索算法-二分查找(Binary Search):对有序数组进行查找,每次将查找范围缩小一半。

-广度优先搜索(BFS):以树或图的形式搜索,从根节点开始,逐层扩展搜索范围,直到找到目标节点。

-深度优先搜索(DFS):以树或图的形式搜索,从根节点开始,逐个访问节点的所有邻居节点,直到找到目标节点或搜索完所有节点。

3.数据结构-数组(Array):一组按顺序存储的相同类型元素的集合,通过索引访问元素,可以快速访问元素,但插入和删除元素较慢。

-链表(Linked List):一组通过指针连接的节点存储的元素的集合,支持灵活的插入和删除操作,但访问元素较慢。

-栈(Stack):一种特殊的线性数据结构,遵循先进后出(LIFO)原则,只能在栈顶进行插入和删除操作。

-队列(Queue):一种特殊的线性数据结构,遵循先进先出(FIFO)原则,在队尾插入元素,队头删除元素。

-堆(Heap):一种特殊的树形数据结构,可以快速找到最小(或最大)元素,常用于实现优先队列。

算法基本知识点总结

算法基本知识点总结

算法基本知识点总结一、算法的基本概念1. 算法的定义算法是用来解决特定问题的有限步骤的有序集合。

算法是一种计算方法,可以描述为一系列清晰的步骤,用来解决特定问题或执行特定任务。

2. 算法的特性(1)有穷性:算法必须在有限的步骤内结束。

(2)确定性:对于相同输入,算法应该产生相同的输出。

(3)可行性:算法必须可行,即算法中的每一步都可以通过已知的计算机能力来执行。

3. 算法的设计目标(1)正确性:算法应该能够解决给定的问题。

(2)可读性:算法应该易于理解和解释。

(3)高效性:算法应该能在合理的时间内完成任务。

二、算法的复杂度分析1. 时间复杂度算法的时间复杂度表示算法执行所需的时间长度,通常用“大O记法”表示。

时间复杂度反映了算法的运行时间与输入规模之间的关系。

常见的时间复杂度包括:(1)O(1):常数时间复杂度,表示算法的运行时间与输入规模无关。

(2)O(logn):对数时间复杂度,表示算法的运行时间与输入规模的对数成正比。

(3)O(n):线性时间复杂度,表示算法的运行时间与输入规模成正比。

(4)O(nlogn):线性对数时间复杂度,表示算法的运行时间与输入规模和对数成正比。

(5)O(n^2):平方时间复杂度,表示算法的运行时间与输入规模的平方成正比。

(6)O(2^n):指数时间复杂度,表示算法的运行时间与输入规模的指数成正比。

2. 空间复杂度算法的空间复杂度表示算法执行所需的内存空间大小。

常见的空间复杂度包括:(1)O(1):常数空间复杂度,表示算法的内存空间与输入规模无关。

(2)O(n):线性空间复杂度,表示算法的内存空间与输入规模成正比。

三、常见的算法设计思想1. 贪心算法贪心算法是一种选取当前最优解来解决问题的算法。

贪心算法的核心思想是从问题的某一初始解出发,通过一系列的局部最优选择,找到全局最优解。

2. 动态规划动态规划是一种将原问题分解成子问题来求解的方法。

动态规划通常适用于具有重叠子问题和最优子结构性质的问题。

排序有哪几种方法

排序有哪几种方法排序是计算机科学中非常重要的概念之一,它指的是将一组元素按照某种规则进行重新排列的过程。

排序算法可以分为多种类型,包括插入排序、交换排序、选择排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序等。

下面我将详细介绍每种排序方法的原理、特点和应用场景。

1. 插入排序(Insertion Sort)插入排序是一种简单且直观的排序算法。

它的原理是将一个未排序的元素逐个地插入到已排序的部分中,最终形成一个完全有序的序列。

具体操作是从第二个元素开始,将其与前面已排序的元素逐个比较并插入到正确的位置。

插入排序的时间复杂度为O(n^2),适用于小规模或部分有序的序列。

2. 交换排序(Exchange Sort)交换排序包括冒泡排序和快速排序。

冒泡排序(Bubble Sort)的原理是从头到尾依次比较相邻的两个元素,如果顺序不对则交换位置,一轮下来可以将最大的元素移动到末尾。

快速排序(Quick Sort)使用了分治的思想,通过选择一个基准元素将序列分成左右两部分,左边的元素都小于该基准值,右边的元素都大于该基准值,然后递归地对左右两部分进行快速排序。

交换排序的平均时间复杂度为O(nlogn),适合用于排序大规模随机数据。

3. 选择排序(Selection Sort)选择排序的原理很简单:每一次从未排序的部分中选择最小(或最大)的元素,放到已排序部分的末尾。

具体操作是通过不断找到最小元素的索引,然后将其与第一个未排序元素交换,如此循环直到所有元素都被排序。

选择排序的时间复杂度为O(n^2),适用于简单的排序需求。

4. 归并排序(Merge Sort)归并排序采用了分治的思想,将一个序列递归地分成两个子序列,直到每个子序列只有一个元素,然后将两个有序的子序列合并成一个有序的序列。

具体操作是比较两个子序列的第一个元素,将较小的元素放入结果序列,然后再比较较小元素所在子序列的下一个元素与另一个子序列的第一个元素,直到所有元素都被放入结果序列。

数据结构的常用算法

数据结构的常用算法一、排序算法排序算法是数据结构中最基本、最常用的算法之一。

常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序等。

1. 冒泡排序冒泡排序是一种简单的排序算法,它重复地比较相邻的两个元素,如果它们的顺序错误就将它们交换过来。

通过多次的比较和交换,最大(或最小)的元素会逐渐“浮”到数列的顶端,从而实现排序。

2. 选择排序选择排序是一种简单直观的排序算法,它每次从待排序的数据中选择最小(或最大)的元素,放到已排序序列的末尾,直到全部元素排序完毕。

3. 插入排序插入排序是一种简单直观的排序算法,它将待排序的数据分为已排序区和未排序区,每次从未排序区中取出一个元素,插入到已排序区的合适位置,直到全部元素排序完毕。

4. 快速排序快速排序是一种常用的排序算法,它采用分治的思想,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分小,然后再按此方法对这两部分数据进行快速排序,递归地进行,最终实现整个序列有序。

5. 归并排序归并排序是一种稳定的排序算法,它采用分治的思想,将待排序的数据分成若干个子序列,分别进行排序,然后将排好序的子序列合并成更大的有序序列,直到最终整个序列有序。

二、查找算法查找算法是在数据结构中根据给定的某个值,在数据集合中找出目标元素的算法。

常见的查找算法有线性查找、二分查找、哈希查找等。

1. 线性查找线性查找是一种简单直观的查找算法,它从数据集合的第一个元素开始,依次比较每个元素,直到找到目标元素或遍历完整个数据集合。

2. 二分查找二分查找是一种高效的查找算法,它要求数据集合必须是有序的。

通过不断地将数据集合分成两半,将目标元素与中间元素比较,从而缩小查找范围,最终找到目标元素或确定目标元素不存在。

3. 哈希查找哈希查找是一种基于哈希表的查找算法,它通过利用哈希函数将目标元素映射到哈希表中的某个位置,从而快速地找到目标元素。

三、图算法图算法是解决图结构中相关问题的算法。

用Java实现常见的8种内部排序算法

⽤Java实现常见的8种内部排序算法⼀、插⼊类排序插⼊类排序就是在⼀个有序的序列中,插⼊⼀个新的关键字。

从⽽达到新的有序序列。

插⼊排序⼀般有直接插⼊排序、折半插⼊排序和希尔排序。

1. 插⼊排序1.1 直接插⼊排序/*** 直接⽐较,将⼤元素向后移来移动数组*/public static void InsertSort(int[] A) {for(int i = 1; i < A.length; i++) {int temp = A[i]; //temp ⽤于存储元素,防⽌后⾯移动数组被前⼀个元素覆盖int j;for(j = i; j > 0 && temp < A[j-1]; j--) { //如果 temp ⽐前⼀个元素⼩,则移动数组A[j] = A[j-1];}A[j] = temp; //如果 temp ⽐前⼀个元素⼤,遍历下⼀个元素}}/*** 这⾥是通过类似于冒泡交换的⽅式来找到插⼊元素的最佳位置。

⽽传统的是直接⽐较,移动数组元素并最后找到合适的位置*/public static void InsertSort2(int[] A) { //A[] 是给定的待排数组for(int i = 0; i < A.length - 1; i++) { //遍历数组for(int j = i + 1; j > 0; j--) { //在有序的序列中插⼊新的关键字if(A[j] < A[j-1]) { //这⾥直接使⽤交换来移动元素int temp = A[j];A[j] = A[j-1];A[j-1] = temp;}}}}/*** 时间复杂度:两个 for 循环 O(n^2)* 空间复杂度:占⽤⼀个数组⼤⼩,属于常量,所以是 O(1)*/1.2 折半插⼊排序/** 从直接插⼊排序的主要流程是:1.遍历数组确定新关键字 2.在有序序列中寻找插⼊关键字的位置* 考虑到数组线性表的特性,采⽤⼆分法可以快速寻找到插⼊关键字的位置,提⾼整体排序时间*/public static void BInsertSort(int[] A) {for(int i = 1; i < A.length; i++) {int temp = A[i];//⼆分法查找int low = 0;int high = i - 1;int mid;while(low <= high) {mid = (high + low)/2;if (A[mid] > temp) {high = mid - 1;} else {low = mid + 1;}}//向后移动插⼊关键字位置后的元素for(int j = i - 1; j >= high + 1; j--) {A[j + 1] = A[j];}//将元素插⼊到寻找到的位置A[high + 1] = temp;}}2. 希尔排序希尔排序⼜称缩⼩增量排序,其本质还是插⼊排序,只不过是将待排序列按某种规则分成⼏个⼦序列,然后如同前⾯的插⼊排序⼀般对这些⼦序列进⾏排序。

大数据结构概念名词解释大全

数据:是对客观事物的符号表示。

数据元素:是数据的基本单位,也称节点(node)或记录(record)。

数据对象:是性质相同的数据元素的集合,是数据的一个子集。

数据项:有独立含义的数据最小单位,也称域(field)。

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

根据数据元素间关系的基本特性,有四种基本数据结构集合:结构中的数据元素之间除了“同属于一个集合”的关系外,别无其他关系。

线性结构:结构中的数据元素之间存在一个对一个的关系。

树形结构:结构中的数据元素之间存在一个对多个的关系。

图状结构或网状结结构:结构中的数据元素之间存在多个对多个的关系。

>逻辑结构:抽象反映数据元素之间的逻辑关系。

(算法设计)物理结构(存储结构):数据结构在计算机中的表示。

(算法实现)存储结构分为:顺序存储结构:借助元素在存储器中的相对位置来表示数据元素间的逻辑关系。

链式存储结构:借助指示元素存储地址的指针表示数据元素间的逻辑关系。

算法:对特定问题求解步骤的一种描述。

算法的五个重要特性:有穷性,确定性,可行性,输入和输出。

算法设计的原则或要求:正确性,可读性,健壮性,效率与低存储量需求。

衡量算法效率的方法:事后统计法和事前分析估算法。

算法执行时间的增长率和f(n) 的增长率相同,则可记作:T (n) = O(f(n)),称T (n) 为算法的(渐近)时间复杂度¥算法运行时间的衡量准则:以基本操作在算法中重复执行的次数。

栈:限定仅在表尾进行插入或删除操作线性表。

入栈:插入元素的操作;出栈:删除栈顶元素的操作。

队列:只能在队首进行删除、队尾进行插入的线性表。

允许插入的一端叫队尾,删除的一端叫队头。

串:由零个或多个字符组成的有限序列;空串:零个字符的串;长度:串中字符的数目;空串:零个字符的串;子串:;串中任意个连续的字符组成的子序列;位置:字符在序列中的序号;相等:串的值相等;空格串:由一个或多个空格组成的串,空格串的长度为串中空格字符的个数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、试验内容
内部排序算法效率比较平台的设计与实现
二、试验目的
问题描述:各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。

试通过随机的数据比较几种主要的基本算法的关键字比较次数和关键字移动次数,以取得直观感受。

三、流程图
冒泡排序
简单选择排序


快速排序
四、源程序代码
#define N 10
int compare[6]={0,0,0,0,0,0},change[6]={0,0,0,0,0,0}; void input(int s[])
{
int test[N];
srand((unsigned)time(NULL));
for(int i=0;i<N;i++)
{
test[i]=rand()%100;
for(int j=0;j<i;j++)
while(test[j]==test[i])
{
test[i]=rand()%N;
j=0;
}
}
for(i=0;i<=N-1;i++)
s[i]=test[i];
}
void swap(int &a,int &b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
void insertsort(int s[])
{
int i,j;
int a[N+1];
for(i=1;i<=N;i++)
{
a[i]=s[i-1];
}
for(i=2;i<=N;i++)
{
a[0]=a[i];
for(j=i;j>0&&a[0]<a[j-1]&&(++compare[0]);j--)
{
a[j]=a[j-1];
change[0]++;
}
a[j]=a[0];
change[0]++;
}
}
void bubble_sort(int s[],int n)
{
int i,j,temp,a[N];
for(i=0;i<n;i++)
{
a[i]=s[i];
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
compare[1]++;
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
change[1]++;
}
}
}
}
int partition(int a[],int low,int high)
{
int t,key;
t=a[low];
key=a[low];
while(low<high)
{
while(low<high&&a[high]>=key)
{
high--;
++compare[2];
}
if(low<high)
{
a[low]=a[high];
low++;
change[2]++;
}
while(low<high&&a[low]<=key)
{
low++;
++compare[2];
}
if(low<high)
{
a[high]=a[low];
high--;
change[2]++;
}
a[low]=t;
}
return low;
}
void quicksort(int a[],int low,int high)
{
int key;
if(low<high)
{
key=partition(a,low,high);
quicksort(a,low,key-1);
quicksort(a,key+1,high);
}
}
void selectsort(int s[],int n)
{
int i,j,k,a[N];
int t;
for(i=0;i<n;i++)
{
a[i]=s[i];
}
for(i=0;i<n-1;i++)
{
j=i;
for(k=i+1;k<=n-1;k++)
{
if(a[k]<a[j]&&(++compare[3]))
j=k;
}
if(j!=i)
{
t=a[i];
a[i]=a[j];
a[j]=t;
change[3]++;
}
}
}
void shellinsertsort(int s[],int n)
{
int i,k,a[N];
k=int(n/2);
for(i=0;i<n;i++)
{
a[i]=s[i];
}
for(int gap = n/2; gap > 0; gap /= 2)
{
for(int i = gap; i < n; i++)
{
int tmp = a[i];
int j = i;
for(; j > 0 && tmp < a[j-gap]; j -= gap)
{
a[j] = a[j-gap];
compare[4]++;
}
a[j] = tmp;
change[4]++;
}
}
}
void heap_adjust(int array[],int i,int len)
{
int rc = array[i];
for(int j = 2 * i; j <len; j *= 2)
{
if(j < len && array[j] < array[j+1]) j++;
{
compare[5]++;
if(rc >= array[j]) break;
}
array[i] = array[j]; i = j;
}
array[i] = rc;
}
void heap_sort(int a[],int len)
{
int i;
for(i = (len-1)/2; i >= 0; i--)
heap_adjust(a,i,len);
for( i = (len-1); i > 0; i--)
{
swap(a[0],a[i]);
change[5]++;//弹出最大值,重新对i-1个元素建堆
heap_adjust(a,0,i-1);
}
}
void CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here UpdateData(TRUE);
int s[10],a[10];
input(s);
for(int i=0;i<N;i++)
{
a[i]=s[i];
}
CString str[100];
for(i=0;i<100;i++)
str[i]=a[i];
for(i=0;i <N;i++)
{
str[i].Format("%i,",a[i]); //把整型数组添加到字符串
m_shuju1+=str[i];
}
insertsort(s);
m_zhijie1=compare[0];
m_zhijie2=change[0];
quicksort(a,0,N-1);
m_kuaisu1=compare[2];
m_kuaisu2=change[2];
selectsort(s,N);
m_jiandan1=compare[3];
m_jiandan2=change[3];
shellinsertsort(s,N);
m_xier1=compare[4];
m_xier2=change[4];
heap_sort(a,N);
m_dui1=compare[5];
m_dui2=change[5];
bubble_sort(s,N);
m_maopao1=compare[1];
m_maopao2=change[1];
CString str2[100];
for(i=0;i<100;i++)
str2[i]=s[i];
for(i=0;i <N;i++)
{
str2[i].Format("%i,",a[i]); //把整型数组添加到字符串
m_shuju2+=str2[i];
}
UpdateData(FALSE);
}
五、调试过程
对于算法的设计,除了希尔排序和堆排序之外,都比较简单,要注意每种排序的起始位置和哨兵的位置,便可以正确的排出。

而希尔排序,尽管是直接插入排序的变形,但应该从中间位置开始,从后至前选择,但是在程序上不好编出。

而堆排序,更是难以控制,只好借鉴参考。

六、结果分析
由随机数产生的10个数,排序后的结果如上图所示,可以发现,快速排序和简单选择排序比较次数和交换次数均较少,适合使用。

相关文档
最新文档