C语言常用排序算法
C语言经典算法大全

C语言经典算法大全1.冒泡排序算法冒泡排序是一种简单但低效的排序算法,它通过多次遍历列表,比较相邻元素并交换位置,直到整个列表有序。
冒泡排序的时间复杂度为O(n^2)。
```void bubbleSort(int arr[], int n)for (int i = 0; i < n-1; i++)for (int j = 0; j < n-i-1; j++)if (arr[j] > arr[j+1])//交换元素int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}```2.选择排序算法选择排序是一种简单但高效的排序算法,它通过多次遍历列表,找到最小元素并将其放置在正确的位置上。
选择排序的时间复杂度也为O(n^2)。
```void selectionSort(int arr[], int n)int minIndex, temp;for (int i = 0; i < n-1; i++)minIndex = i;for (int j = i+1; j < n; j++)if (arr[j] < arr[minIndex])minIndex = j;}}//交换元素temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}```3.插入排序算法插入排序是一种简单但高效的排序算法,它通过将未排序的元素插入到已排序的列表中,逐步构建排序好的列表。
插入排序的时间复杂度为O(n^2)。
```void insertionSort(int arr[], int n)int i, key, j;for (i = 1; i < n; i++)key = arr[i];j=i-1;while (j >= 0 && arr[j] > key)arr[j + 1] = arr[j];j=j-1;}arr[j + 1] = key;}```4.快速排序算法快速排序是一种高效的排序算法,它通过选择一个主元,将列表分割为两个子列表,其中一个子列表的所有元素都小于主元,另一个子列表的所有元素都大于主元。
C语言--常见排序算法

49
2 j 49
08
0
25* 3 49 25
16 4
21
5
08
25
25*
16
21
i k 49
j 25* 25
08
25
25*
16
21
算法实例:
1.1.5 选择排序
49 2
08 0
25 1 i
25* 3
16 4 k
21 5 j 21 16
k 指示当前序列中最小者
算法实现:
08 5 temp
16 21 25 25* 49 08 0 1 2 3 4 5
算法实现:
1.1.3 直接插入排序
void InsertSort (int r[ ], int n ) { // 假设关键字为整型,放在向量r[]中 int i, j, temp; for (i = 1;i< n;i++ ) { temp = r[i]; for(j = i;j>0;j- -) {//从后向前顺序比较,并依次后移 if ( temp < r[j-1] ) r[j] = r[j-1]; else break; } r[j] = temp; } }
输入n 个数给a[1] 到 a[n]
for j=1 to n-1
for i=1 to n-j
真 a[i]>a[i+1]
a[i]a[i+1]
输出a[1] 到 a[n]
main() { int a[11],i,j,t; printf("Input 10 numbers:\n"); for(i=1;i<11;i++) scanf("%d",&a[i]); printf("\n"); 假 for(j=1;j<=9;j++) for(i=1;i<=10-j;i++) if(a[i]>a[i+1]) {t=a[i]; a[i]=a[i+1]; a[i+1]=t;} printf("The sorted numbers:\n"); for(i=1;i<11;i++) printf("%d ",a[i]); }
C语言常用算法概述

C语言常用算法概述C语言作为一种通用的高级编程语言,广泛应用于计算机科学领域,特别是在算法和数据结构方面。
C语言提供了许多常用算法,这些算法能够解决各种计算问题,并提供了高效的解决方案。
本文将概述C语言中常用的算法,包括排序算法、查找算法和图算法。
一、排序算法排序算法是将一组元素按照特定的顺序排列的算法。
C语言提供多种排序算法,下面将介绍几种常用的排序算法。
1. 冒泡排序冒泡排序是一种简单的排序算法,它通过多次遍历数组,每次比较相邻的两个元素,将较大的元素向后移动。
通过多次遍历,最大的元素会逐渐“冒泡”到数组的末尾。
2. 插入排序插入排序是一种稳定的排序算法,它通过将数组分为已排序和未排序两部分,将未排序的元素逐个插入已排序的部分,使得整个数组逐渐有序。
3. 快速排序快速排序是一种高效的排序算法,它通过选择一个基准元素,将数组分成两个子数组,其中一个子数组中的元素都小于基准,另一个子数组中的元素都大于基准。
然后递归地对两个子数组进行排序。
4. 归并排序归并排序是一种稳定的排序算法,它通过将数组划分为多个子数组,然后将这些子数组逐个合并,最终得到有序的数组。
归并排序使用了分治的思想,对子数组进行递归排序。
二、查找算法查找算法用于在一个集合中寻找特定元素的算法。
C语言提供了多种查找算法,下面将介绍两种常用的查找算法。
1. 顺序查找顺序查找是一种简单的查找算法,它通过逐个比较集合中的元素,直到找到需要查找的元素或者遍历完整个集合。
2. 二分查找二分查找是一种高效的查找算法,它要求集合必须有序。
它通过将集合分成两半,然后比较需要查找的元素与中间元素的大小关系,从而确定下一步查找的范围。
三、图算法图算法用于解决图结构相关的计算问题。
C语言提供了多种图算法,下面将介绍两种常用的图算法。
1. 深度优先搜索深度优先搜索是一种用于遍历或搜索图的算法,它通过从一个顶点出发,依次访问与该顶点相邻的未访问过的顶点。
当无法再继续访问时,回退到上一个顶点继续搜索。
C语言常用算法总结

C语言常用算法总结1、冒泡排序算法:冒泡排序是一种简单的排序算法,它重复地遍历要排序的序列,一次比较两个相邻的元素如果他们的顺序错误就把他们交换过来。
时间复杂度为O(n^2)。
2、快速排序算法:快速排序是一种基于分治的排序算法,通过递归的方式将数组划分为两个子数组,然后对子数组进行排序最后将排好序的子数组合并起来。
时间复杂度为O(nlogn)。
3、插入排序算法:插入排序是一种简单直观的排序算法,通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描找到相应位置并插入。
时间复杂度为O(n^2)。
4、选择排序算法:选择排序是一种简单的排序算法,每次循环选择未排序部分的最小元素,并放置在已排序部分的末尾。
时间复杂度为O(n^2)。
5、归并排序算法:归并排序是一种稳定的排序算法,基于分治思想,将数组递归地分为两个子数组,将子数组排序后再进行合并最终得到有序的数组。
时间复杂度为O(nlogn)。
6、堆排序算法:堆排序是一种基于完全二叉堆的排序算法,通过构建最大堆或最小堆,然后依次将堆顶元素与末尾元素交换再调整堆,得到有序的数组。
时间复杂度为O(nlogn)。
7、二分查找算法:二分查找是一种在有序数组中查找目标元素的算法,每次将待查找范围缩小一半,直到找到目标元素或范围为空。
时间复杂度为O(logn)。
8、KMP算法:KMP算法是一种字符串匹配算法,通过利用模式字符串的自重复性,避免不必要的比较提高匹配效率。
时间复杂度为O(m+n),其中m为文本串长度,n为模式串长度。
9、动态规划算法:动态规划是一种通过将问题分解为子问题,并通过组合子问题的解来求解原问题的方法。
动态规划算法通常使用内存空间来存储中间结果,从而避免重复计算。
时间复杂度取决于问题规模。
10、贪心算法:贪心算法是一种通过选择局部最优解来构建全局最优解的算法并以此构建最终解。
时间复杂度取决于问题规模。
11、最短路径算法:最短路径算法用于求解图中两个节点之间的最短路径,常见的算法包括Dijkstra算法和Floyd-Warshall算法。
使用C语言实现12种排序方法

使⽤C语⾔实现12种排序⽅法⽬录1.冒泡排序2.插⼊排序3.折半插⼊排序4.希尔排序5.选择排序6.鸡尾酒排序7.堆排序8.快速排序9.归并排序10.计数排序11.桶排序12.基数排序1.冒泡排序思路:⽐较相邻的两个数字,如果前⼀个数字⼤,那么就交换两个数字,直到有序。
时间复杂度O(n^2),稳定性:这是⼀种稳定的算法。
代码实现:void bubble_sort(int arr[],size_t len){size_t i,j;for(i=0;i<len;i++){bool hasSwap = false; //优化,判断数组是否已经有序,如果有序可以提前退出循环for(j=1;j<len-i;j++){ //这⾥j<len-i是因为最后⾯的肯定都是最⼤的,不需要多进⾏⽐较if(arr[j-1]>arr[j]){ //如果前⼀个⽐后⼀个⼤swap(&arr[j-1],&arr[j]); //交换两个数据hasSwap = true;}}if(!hasSwap){break;}}}2.插⼊排序思路:把⼀个数字插⼊⼀个有序的序列中,使之仍然保持有序,如对于需要我们进⾏排序的数组,我们可以使它的前i个数字有序,然后再插⼊i+1个数字,插⼊到合适的位置使之仍然保持有序,直到所有的数字有序。
时间复杂度:O(n^2) 稳定性:稳定的算法代码实现:void insert_sort(int arr[],int len){int i,j;for(i=1;i<len;i++){int key = arr[i]; //记录当前需要插⼊的数据for(j= i-1;i>=0&&arr[j]>key;j--){ //找到插⼊的位置arr[j+1] = arr[j]; //把需要插⼊的元素后⾯的元素往后移}arr[j+1] = key; //插⼊该元素}}3.折半插⼊排序思路:本质上是插⼊排序,但是通过半分查找法找到插⼊的位置,让效率稍微快⼀点。
C语言算法全总结

C语言算法全总结C语言是一种广泛应用于计算机科学领域的编程语言,具有高效、可移植和灵活的特点。
在程序设计中,算法是解决问题的一系列有序步骤,可以通过C语言来实现。
本文将为您总结C语言中常用的算法,包括排序算法、查找算法和图算法。
一、排序算法排序算法是将一组元素按照特定的顺序重新排列的算法。
常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序和归并排序。
这些算法的核心思想是通过比较和交换元素的位置来进行排序。
1.冒泡排序冒泡排序通过多次比较和交换相邻元素的位置来实现排序。
它的基本思想是将最大的元素不断地往后移动,直到整个序列有序。
2.选择排序选择排序通过每次选择最小的元素来实现排序。
它的基本思想是通过比较找到最小元素的位置,然后将其与第一个元素交换,接着在剩下的元素中继续找到最小元素并进行交换,如此重复直到整个序列有序。
3.插入排序插入排序通过构建有序序列,对未排序序列逐个元素进行插入,从而实现排序。
它的基本思想是将当前元素插入到前面已经排好序的序列中的适当位置。
4.快速排序快速排序是一种分治算法,通过选择一个基准元素,将其他元素划分为小于基准元素和大于基准元素的两部分,然后递归地对这两部分进行排序,最终实现整个序列有序。
5.归并排序归并排序也是一种分治算法,将序列分成两个子序列,分别对这两个子序列进行排序,然后将排序后的子序列合并成一个有序序列,从而达到整个序列有序的目的。
二、查找算法查找算法是在一个数据集合中寻找特定元素的算法。
常见的查找算法包括线性查找、二分查找和散列查找。
这些算法的核心思想是通过比较元素的值来确定待查找元素的位置。
1.线性查找线性查找是从数据集合的开头开始,依次比较每个元素的值,直到找到目标元素为止。
它的时间复杂度为O(n),其中n为数据集合的大小。
2.二分查找二分查找是针对有序序列进行查找的算法,它的基本思想是通过不断缩小查找范围,将目标元素与中间元素进行比较,从而确定待查找元素的位置。
C语言八大排序算法

C语⾔⼋⼤排序算法C语⾔⼋⼤排序算法,附动图和详细代码解释!来源:C语⾔与程序设计、⽵⾬听闲等⼀前⾔如果说各种编程语⾔是程序员的招式,那么数据结构和算法就相当于程序员的内功。
想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。
⼆⼋⼤排序算法排序算法作为数据结构的重要部分,系统地学习⼀下是很有必要的。
1、排序的概念排序是计算机内经常进⾏的⼀种操作,其⽬的是将⼀组“⽆序”的记录序列调整为“有序”的记录序列。
排序分为内部排序和外部排序。
若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。
反之,若参加排序的记录数量很⼤,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。
2、排序分类⼋⼤排序算法均属于内部排序。
如果按照策略来分类,⼤致可分为:交换排序、插⼊排序、选择排序、归并排序和基数排序。
如下图所⽰:3、算法分析1.插⼊排序*直接插⼊排序*希尔排序2.选择排序*简单选择排序*堆排序3.交换排序*冒泡排序*快速排序4.归并排序5.基数排序不稳定排序:简单选择排序,快速排序,希尔排序,堆排序稳定排序:冒泡排序,直接插⼊排序,归并排序,奇数排序1、插⼊排序将第⼀个和第⼆个元素排好序,然后将第3个元素插⼊到已经排好序的元素中,依次类推(插⼊排序最好的情况就是数组已经有序了)因为插⼊排序每次只能操作⼀个元素,效率低。
元素个数N,取奇数k=N/2,将下标差值为k的数分为⼀组(⼀组元素个数看总元素个数决定),在组内构成有序序列,再取k=k/2,将下标差值为k的数分为⼀组,构成有序序列,直到k=1,然后再进⾏直接插⼊排序。
3、简单选择排序选出最⼩的数和第⼀个数交换,再在剩余的数中⼜选择最⼩的和第⼆个数交换,依次类推4、堆排序以升序排序为例,利⽤⼩根堆的性质(堆顶元素最⼩)不断输出最⼩元素,直到堆中没有元素1.构建⼩根堆2.输出堆顶元素3.将堆低元素放⼀个到堆顶,再重新构造成⼩根堆,再输出堆顶元素,以此类推5、冒泡排序改进1:如果某次冒泡不存在数据交换,则说明已经排序好了,可以直接退出排序改进2:头尾进⾏冒泡,每次把最⼤的沉底,最⼩的浮上去,两边往中间靠16、快速排序选择⼀个基准元素,⽐基准元素⼩的放基准元素的前⾯,⽐基准元素⼤的放基准元素的后⾯,这种动作叫分区,每次分区都把⼀个数列分成了两部分,每次分区都使得⼀个数字有序,然后将基准元素前⾯部分和后⾯部分继续分区,⼀直分区直到分区的区间中只有⼀个元素的时候,⼀个元素的序列肯定是有序的嘛,所以最后⼀个升序的序列就完成啦。
C语言中的算法实现

C语言中的算法实现算法是计算机科学中非常重要的概念,它是解决问题的一系列步骤或指令集。
在C语言中,我们可以使用不同的方法来实现算法。
本文将介绍一些常见的C语言算法实现方式。
一、排序算法1. 冒泡排序冒泡排序是一种简单但效率较低的排序算法。
它通过不断比较相邻的元素,并按照规则交换它们的位置,直到整个序列排序完成。
2. 选择排序选择排序是一种简单而直观的排序算法。
它每次从未排序的序列中选择最小(或最大)的元素,并将其放置在已排序序列的末尾。
3. 插入排序插入排序是一种简单且高效的排序算法。
它通过构建有序序列,对未排序的元素逐个插入到已排序的序列中,直到所有元素都被插入完成。
二、查找算法1. 顺序查找顺序查找是一种简单的查找算法。
它从列表的开头开始逐个比较元素,直到找到目标元素或查找完整个列表。
2. 二分查找二分查找是一种高效的查找算法,但要求列表必须是有序的。
它通过将待查找区域分成两部分,判断目标元素落在哪一部分,从而缩小查找范围,直到找到目标元素或确定不存在。
三、递归算法递归是一种常用的算法设计技巧。
它通过在函数内调用自身来解决相同问题的不同实例。
在C语言中,递归函数需要定义出口条件,以避免无限递归。
四、动态规划算法动态规划是一种用于解决具有重叠子问题和最优子结构性质的问题的方法。
它将问题分解为一系列子问题,并以自底向上的方式求解子问题,最终得到整体问题的解。
在C语言中,可以使用循环、数组和指针等特性来实现动态规划算法,从而有效地解决问题。
五、图算法图是一种用于描述对象之间关系的数据结构,图算法是解决图相关问题的一类算法。
常见的图算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。
六、字符串算法字符串算法用于处理字符串相关的问题,如字符串匹配、编辑距离等。
C语言提供了一系列字符串处理函数,如strlen、strcpy等,可以方便地实现字符串算法。
七、数学算法C语言在数学算法方面提供了丰富的库函数支持,如求平方根、对数、指数等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*===================================================================== ========相关知识介绍(所有定义只为帮助读者理解相关概念,并非严格定义):1、稳定排序和非稳定排序简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就说这种排序方法是稳定的。
反之,就是非稳定的。
比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为a1,a2,a4,a3,a5,则我们说这种排序是稳定的,因为a2排序前在a4的前面,排序后它还是在a4的前面。
假如变成a1,a4,a2,a3,a5就不是稳定的了。
2、内排序和外排序在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。
3、算法的时间复杂度和空间复杂度所谓算法的时间复杂度,是指执行算法所需要的计算工作量。
一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。
===================================================================== ===========*//*================================================功能:选择排序输入:数组名称(也就是数组首地址)、数组中元素个数================================================*//*====================================================算法思想简单描述:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
选择排序是不稳定的。
算法复杂度O(n2)--[n的平方]=====================================================*/void select_sort(int *x, int n){int i, j, min, t;for (i=0; i<n-1; i++) /*要选择的次数:0~n-2共n-1次*/{min = i; /*假设当前下标为i的数最小,比较后再调整*/for (j=i+1; j<n; j++)/*循环找出最小的数的下标是哪个*/{if (*(x+j) < *(x+min)){min = j; /*如果后面的数比前面的小,则记下它的下标*/}}if (min != i) /*如果min在循环中改变了,就需要交换数据*/ {t = *(x+i);*(x+i) = *(x+min);*(x+min) = t;}}}/*================================================功能:直接插入排序输入:数组名称(也就是数组首地址)、数组中元素个数================================================*//*====================================================算法思想简单描述:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。
如此反复循环,直到全部排好顺序。
直接插入排序是稳定的。
算法时间复杂度O(n2)--[n的平方]=====================================================*/void insert_sort(int *x, int n){int i, j, t;for (i=1; i<n; i++) /*要选择的次数:1~n-1共n-1次*/{/*暂存下标为i的数。
注意:下标从1开始,原因就是开始时第一个数即下标为0的数,前面没有任何数,单单一个,认为它是排好顺序的。
*/t=*(x+i);for (j=i-1; j>=0 && t<*(x+j); j--) /*注意:j=i-1,j--,这里就是下标为i的数,在它前面有序列中找插入位置。
*/{*(x+j+1) = *(x+j); /*如果满足条件就往后挪。
最坏的情况就是t比下标为0的数都小,它要放在最前面,j==-1,退出循环*/}*(x+j+1) = t; /*找到下标为i的数的放置位置*/}}/*================================================功能:冒泡排序输入:数组名称(也就是数组首地址)、数组中元素个数================================================*//*====================================================算法思想简单描述:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。
即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
下面是一种改进的冒泡算法,它记录了每一遍扫描后最后下沉数的位置k,这样可以减少外层循环扫描的次数。
冒泡排序是稳定的。
算法时间复杂度O(n2)--[n的平方]=====================================================*/void bubble_sort(int *x, int n){int j, k, h, t;for (h=n-1; h>0; h=k) /*循环到没有比较范围*/{for (j=0, k=0; j<h; j++) /*每次预置k=0,循环扫描后更新k*/{if (*(x+j) > *(x+j+1)) /*大的放在后面,小的放到前面*/{t = *(x+j);*(x+j) = *(x+j+1);*(x+j+1) = t; /*完成交换*/k = j; /*保存最后下沉的位置。
这样k后面的都是排序排好了的。
*/ }}}}/*================================================功能:希尔排序输入:数组名称(也就是数组首地址)、数组中元素个数================================================*//*====================================================算法思想简单描述:在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。
如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。
D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。
算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。
当增量减到1时,整个要排序的数被分成一组,排序完成。
下面的函数是一个希尔排序算法的一个实现,初次取序列的一半为增量,以后每次减半,直到增量为1。
希尔排序是不稳定的。
=====================================================*/void shell_sort(int *x, int n){int h, j, k, t;for (h=n/2; h>0; h=h/2) /*控制增量*/{for (j=h; j<n; j++) /*这个实际上就是上面的直接插入排序*/{t = *(x+j);for (k=j-h; (k>=0 && t<*(x+k)); k-=h){*(x+k+h) = *(x+k);}*(x+k+h) = t;}}}/*================================================功能:快速排序输入:数组名称(也就是数组首地址)、数组中起止元素的下标================================================*//*====================================================算法思想简单描述:快速排序是对冒泡排序的一种本质改进。
它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。
在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。
快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。
然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。
它是由C.A.R.Hoare于1962年提出的。
显然快速排序可以用递归实现,当然也可以用栈化解递归实现。
下面的函数是用递归实现的,有兴趣的朋友可以改成非递归的。
快速排序是不稳定的。
最理想情况算法时间复杂度O(nlog2n),最坏O(n2)=====================================================*/void quick_sort(int *x, int low, int high){int i, j, t;if (low < high) /*要排序的元素起止下标,保证小的放在左边,大的放在右边。
这里以下标为low的元素为基准点*/{i = low;j = high;t = *(x+low); /*暂存基准点的数*/while (i<j) /*循环扫描*/{while (i<j && *(x+j)>t) /*在右边的只要比基准点大仍放在右边*/{j--; /*前移一个位置*/}if (i<j){*(x+i) = *(x+j); /*上面的循环退出:即出现比基准点小的数,替换基准点的数*/i++; /*后移一个位置,并以此为基准点*/}while (i<j && *(x+i)<=t) /*在左边的只要小于等于基准点仍放在左边*/ {i++; /*后移一个位置*/}if (i<j){*(x+j) = *(x+i); /*上面的循环退出:即出现比基准点大的数,放到右边*/j--; /*前移一个位置*/}}*(x+i) = t; /*一遍扫描完后,放到适当位置*/quick_sort(x,low,i-1); /*对基准点左边的数再执行快速排序*/quick_sort(x,i+1,high); /*对基准点右边的数再执行快速排序*/}/*================================================功能:堆排序输入:数组名称(也就是数组首地址)、数组中元素个数================================================*//*====================================================算法思想简单描述:堆排序是一种树形选择排序,是对直接选择排序的有效改进。