三九宝宝网宝宝百科宝宝知识

谁有快速堆排序算法啊

04月04日 编辑 39baobao.com

[数据结构教程第三十四课插入排序,快速排序]教学目的: 掌握排序的基本概念,插入排序、快速排序的算法教学重点: 插入排序、快速排序的算法教学难点: 快速排序算法授课内容:一、排序概述排序:将一个数据元素的无序序列重...+阅读

#include "stdio.h" #include "windows.h" #include //#include #include #pragma comment(lib,"winmm.lib") //#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) void quicklysort(int *,int ,int );//快速排序算法 void heapadjust(int *,int ,int );//堆调整 void heapsort(int *,int );//堆排序算法 HANDLE hout; SYSTEMTIME st; void setpoint(int x,int y) { COORD tp; tp.X=x; tp.Y=y; SetConsoleCursorPosition(hout,tp); } void main() { system("color 1E"); int i,j; COORD pt; GetLocalTime(&st); hout=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTitle("排序算法"); setpoint(0,1); printf(" "); printf("┏"); for(i=0;i0&i=3&i=7&ii) { while(j>i&a[j]>temp) j--; if(j>i) a[i]=a[j]; while(j>i&a[i]i) a[j]=a[i]; } a[i]=temp; if(sa[j+1]) j++; if(temp>a[j]) { a[i]=a[j]; i=j; j=2*i; } else j=t+1; } a[i]=temp; } void heapsort(int *a,int n) { int i; int temp; for(i=n/2;i>=0;i--) heapadjust(a,i,n); for(i=n;i>0;i--) { temp=a[0]; a[0]=a[i]; a[i]=temp; heapadjust(a,0,i-1); } }

快速排序法如何排序

第一遍 【12】 31 54 65 32 34 45 68 75 85 43 77 98第二遍 12 【31】 54 65 32 34 45 68 75 85 43 77 98第三遍 12 31 32 34 45 43 【54】 98 77 85 75 68 65第四遍 12 31 【32】 34 45 43 54 98 77 85 75 68 65第五遍 12 31 32 【34】 45 43 54 98 77 85 75 68 65第六遍 12 31 32 34 43 【45】 54 98 77 85 75 68 65第七遍 12 31 32 34 【43】 45 54 98 77 85 75 68 65 (左边区间所有递归完成,开始右边区间逐一递归)第八遍 12 31 32 34 43 45 54 65 68 75 85 77 【98】 第九遍 12 31 32 34 43 45 54 【65】 68 75 85 77 98第十遍 12 31 32 34 43 45 54 65 【68】 75 85 77 98第十一遍 12 31 32 34 43 45 54 65 68 【75】 85 77 98第十二遍 12 31 32 34 43 45 54 65 68 75 77 【85】 98第十三遍12 31 32 34 43 45 54 65 68 75 【77】 85 98 快速算法每次取当前无序区的第一个记录为基准,首先取12作为tep量,起始位置i=0,终止位置j=12.最外层循环,只要i 不等于 j 就扫描,内层循环,首先从右向左扫描,找到第一个小于tep的值,再交换这个值和tep,这样tep的左边都是比他小的数,再从左向右扫描,找到第1个大于tep的值,与tep交换,这样右边都是比tep大的数。

接下来,递归此程序,用同样方法快速排序那个tep值的左区间和右区间。可以看做是,先得出无序区第一个在此序列里应有的位置,再依此位置为轴,排序左右区间,又分别得出左右无序区间的第一个值在序列里的应有位置。

算法设计快速排序完整程序

#include <stdio.h>

#define MAX 255

int R[MAX];

int Partition(int i,int j)

{/* 调用Partition(R,low,high)时,对R[low..high]做划分,*/

/* 并返回基准记录的位置 */

int pivot=R[i]; /* 用区间的第1个记录作为基准 */

while(i<j){ /* 从区间两端交替向中间扫描,直至i=j为止 */

while(i<j&&R[j]>=pivot) /* pivot相当于在位置i上 */

j--; /* 从右向左扫描,查找第1个关键字小于pivot.key的记录R[j] */

if(i<j) /* 表示找到的R[j]的关键字<pivot.key */

R[i++]=R[j]; /* 相当于交换R[i]和R[j],交换后i指针加1 */

while(i<j&&R[i]<=pivot) /* pivot相当于在位置j上*/

i++; /* 从左向右扫描,查找第1个关键字大于pivot.key的记录R[i] */

if(i<j) /* 表示找到了R[i],使R[i].key>pivot.key */

R[j--]=R[i]; /* 相当于交换R[i]和R[j],交换后j指针减1 */

} /* endwhile */

R[i]=pivot; /* 基准记录已被最后定位*/

return i;

} /* end of partition */

void Quick_Sort(int low,int high)

{ /* 对R[low..high]快速排序 */

int pivotpos; /* 划分后的基准记录的位置 */

if(low<high){/* 仅当区间长度大于1时才须排序 */

pivotpos=Partition(low,high); /* 对R[low..high]做划分 */

Quick_Sort(low,pivotpos-1); /* 对左区间递归排序 */

Quick_Sort(pivotpos+1,high); /* 对右区间递归排序 */

}

} /* end of Quick_Sort */

void main()

{

int i,n;

puts("Please input total element number of the sequence:");

scanf("%d",&n);

if(n<=0||n>MAX)

{

printf("n must more than 0 and less than %d.\n",MAX);

exit(0);

}

puts("Please input the elements one by one:");

for(i=1;i<=n;i++)

scanf("%d",&R[i]);

puts("The sequence you input is:");

for(i=1;i<=n;i++)

printf("%4d",R[i]);

Quick_Sort(1,n);

puts("\nThe sequence after quick_sort is:");

for(i=1;i<=n;i++)

printf("%4d",R[i]);

puts("\n Press any key to quit...");

}

//LZ仔细研究研究

快速排序算法

C语言程序:

/* 快 速 排 序 */

#include "stdio.h"

void QuickSort(int e[], int first, int end)

{

int i=first,j=end,temp=e[first];

while(i

{

while(i=temp)

j--;

e[i]=e[j];

while(i

i++;

e[j]=e[i];

}

e[i]=temp;

if(first

QuickSort(e,first,i-1);

if(end>i+1)

QuickSort(e,i+1,end);

}

void main()

{

int arr[] = {49, 38, 65, 97, 76, 13, 27, 49};

int len = 8;

int i;

printf("before sort\n");

for(i=0; i

printf("%d ", arr[i]);

printf("\n");

QuickSort(arr, 0, len-1);

printf("after sorted\n");

for(i=0; i

printf("%d ", arr[i]);

printf("\n");

}

以下为关联文档:

算法回顾之插入排序使用范围:小规模数据的排序的方案,而且是一种稳定的排序算法复杂度:O(n2) 思想: 首先我们来想一个问题,我们是否能找到一种方法,使一个数插入到一个有序的数组当中,并保证它依然有...

怎么堆雪人啊请教下下步骤 1. 确定雪人的堆放位置后开始建立雪人的底座,聚拢附近的雪形成底座。底座的大小决定你要堆多大的雪人。 2. 开始做身子。用手做一个小雪球,然后放在地上慢慢的滚,滚到比底...

谁有数学乘法简便算法抛开乘法简算法则 十几乘十几: 口诀:头乘头,尾加尾,尾乘尾. 例:12*14=? 1*1=1 2+4=6 2*4=8 12*14=168 注:个位相乘,不够两位数要用0占位. 2.头相同,尾互补(尾相加等于10): 口诀:一个头...

冒泡算法升序排序数组中随机生成的10个数public class MaoPiao { /** * 冒泡算法,升序排序数组中随机生成的10个数 */ public static void main(String[] args) { Random rd = new Random(); int a[] = new int[10];...

用程序流程图表示快速排序和冒泡排序什么意思?怎么写啊冒泡排序思想 :每次前后两个比较,前面大就交换这两个,一直到最后这是一趟,需要n趟(小到大排序) 例如:4 2 7 1 8 对这几个数冒泡排序 2 4 7 1 8 第一趟第一次交换2 4 2 4 7 1 8 第一...

vb快速排序算法不明白原理求教悬赏100dim i as long,j as long,aa()as string,t as string '假设数据存放在一个未知长度的数组aa里面 for i=0 to ubound(aa) for j=0 to ubound(aa)-i if aa(j)>aa(j+1) then t=...

用VBS学习快速排序算法出现问题请指教!如下:快速排序法”使用的是递归原理,下面我结合一个例子来说明“快速排序法”的原理。首先给出一个数组{53,12,98,63,18,72,80,46, 32,21},先找到第一个数--53,把它作为中间值,也就是...

编写一个双向冒泡排序算法是什么编写一个双向冒泡排序算法是什么,C中冒泡排序算法思想:解:实现抄本袭题功能的算法如知下:道 void dbubblesort(sqlist r,int n) { int i,j,flag; flag=1; i=1; while(flag!=0)...

双向冒泡排序算法怎么写双向冒泡排序算法怎么写,c双向冒泡排序:void BubbleSort_(int a[],int n) { int tmp; int i=0; int j=0; for(;i+j<n;i++,j++) { for(int i_=0;i_<n-i-1;i_++) { if(a[i_]>a[i...

推荐阅读
图文推荐