以下排序的算法 快速排序 冒泡排序 直接插入排序 堆排序

如题所述

================================================
功能:快速排序
输入:数组名称(也就是数组首地址)、数组中起止元素的下标
================================================

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); /*对基准点右边的数再执行快速排序*/
}
}

================================================
功能:冒泡排序
输入:数组名称(也就是数组首地址)、数组中元素个数
================================================

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后面的都是排序排好了的。*/
}
}
}
}

================================================
功能:直接插入排序
输入:数组名称(也就是数组首地址)、数组中元素个数
================================================

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的数的放置位置*/
}
}

================================================
功能:堆排序
输入:数组名称(也就是数组首地址)、数组中元素个数
================================================
*/
/*
功能:渗透建堆
输入:数组名称(也就是数组首地址)、参与建堆元素的个数、从第几个元素开始
*/
void sift(int *x, int n, int s)
{
int t, k, j;
t = *(x+s); /*暂存开始元素*/
k = s; /*开始元素下标*/
j = 2*k + 1; /*右子树元素下标*/
while (j<n)
{
if (j<n-1 && *(x+j) < *(x+j+1))/*判断是否满足堆的条件:满足就继续下一轮比较,否则调整。*/
{
j++;
}
if (t<*(x+j)) /*调整*/
{
*(x+k) = *(x+j);
k = j; /*调整后,开始元素也随之调整*/
j = 2*k + 1;
}
else /*没有需要调整了,已经是个堆了,退出循环。*/
{
break;
}
}
*(x+k) = t; /*开始元素放到它正确位置*/
}

/*
功能:堆排序
输入:数组名称(也就是数组首地址)、数组中元素个数
*/
void heap_sort(int *x, int n)
{
int i, k, t;
//int *p;
for (i=n/2-1; i>=0; i--)
{
sift(x,n,i); /*初始建堆*/
}
for (k=n-1; k>=1; k--)
{
t = *(x+0); /*堆顶放到最后*/
*(x+0) = *(x+k);
*(x+k) = t;
sift(x,k,0); /*剩下的数再建堆*/
}
}
/*构造随机输出函数类*/
void input(int a[]){
int i;
srand( (unsigned int)time(NULL) );
for (i = 0; i < 4; i++)
{
a[i] = rand() % 100;
}
printf("\n");
}
/*构造键盘输入函数类*/
/*void input(int *p)
{
int i;
printf("请输入 %d 个数据 :\n",MAX);
for (i=0; i<MAX; i++)
{
scanf("%d",p++);
}
printf("\n");
}*/
/*构造输出函数类*/
void output(int *p)
{
int i;
for ( i=0; i<MAX; i++)
{
printf("%d ",*p++);
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2016-01-17
你想要什么语言追问

算法通用公式

冒泡排序,快速排序,插入排序,堆排序哪个时间复杂度最高?
答案是D,堆排序。选项中的四种排序方法的最坏时间复杂度、最好时间复杂度 、平均时间复杂度分别为:A、冒泡排序: O(n2) 、O(n) 、O(n2)。B、快速排序: O(n2) 、O(nlog2n)、 O(nlog2n)。C、插入排序: O(n2)、 O(n) 、O(n2)。D、堆排序: O(nlog2n)、 O(nlog2n)、 ...

下面四种排序算法中,稳定的算法是( )。
【答案】:A、B 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法;冒泡排序、插入排序、归并排序和基数排序都是稳定的排序算法。

...A) 快速排序 (B) 冒泡排序 (C) 希尔排序 (D) 堆
快速排序,正常为O(log2n),这也是递归的深度,如果基准值选择不好为O(n),当然,即使非递归结果也是如此 冒泡排序属于简单排序,只需要几个辅助循环变量,因此为O(1)希尔排序,只是将直接插入排序进行修改,一般不设置特别的缩小增量序列,也是O(1)堆排序,只需要一个中间用辅助变量和一些循环变量,...

冒泡排序,堆排序,快速排序,插入排序,归并排序的的稳定性及时间空间复...
1、冒泡排序、直接插入排序、二分插入排序、归并排序,基数排序都是稳定排序。不稳定排序:直接选择排序、堆排序、快速排序、希尔排序,猴子排序。以升序为例,比较相邻的元素,如果第一个比第二个大,则交换他们两个。2、归并排序是稳定的排序算法。归并排序的稳定性分析:归并排序是把序列递归地分成短序...

...什么是快速排序,冒泡排序,直接插入排序,堆序法?thx
冒泡排序: bubblesort:简单的方法,从第一个数开始,依次和后面比较,比后面大就往后移动,直到排完,举例: 5,1,2,3,4. 先看5-1,5,2,3,4-1,2,5,3,4-1,2,3,5,4-1,2,3,4,5.这例子特殊,一下排完,事实上复杂度为O(n*n);插入排序: insertion sort: ...

...单选题 题目:从1000个元素中选出其中五个最大值元素( )排序最...
可选答案:1.冒泡 2.快速排序 3.堆排序 4.选择排序 第2题 题目类型: 单选题 题目:以下排序方法中,稳定的排序方法是(2 )。可选答案:1.直接插入排序和希尔排序 2.直接插入排序和冒泡排序 3.希尔排序和快速排序 4.冒泡排序和快速排序 第3题 题目类型: 单选题 题目:在有序表(3,8,13,15...

...下列内部排序算法中: A.快速排序 B.直接插入排序 C.二路归并排序 D...
插入 n^2 n^2 n 希尔 n^1.3 \/ \/ 冒泡 n^2 n^2 n 快速 nlogn n^2 nlogn 选择 n^2 n^2 n^2 堆排 nlogn nlogn nlogn 归并 nlogn nlogn nlogn 基数 ...

排序方法有哪几种
1、排序方法有10种,分别是:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。2、冒泡排序算法是把较小的元素往前调或者把较大的元素往后调。这种方法主要是通过对相邻两个元素进行大小的比较,根据比较结果和算法规则对该二元素的位置进行交换,这样逐个...

排序都有哪几种方法?请列举。用JAVA实现一个快速排序。
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)快速排序的伪代码。\/ \/使用快速排序方法对a[ 0 :n- 1 ]排序 从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点 ...

排序算法有哪些,简述快速排序的核心
简单的: 冒泡,选择排序,插入排序,桶排序,复杂点的: 堆排序,归并排序,快速排序,还有 基数排序,计数排序(这两个我还没接触到,不懂)快速排序核心:每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡...

相似回答