什么是KEYC类型c 数组是什么类型

5076人阅读
&很多朋友是以谭浩强老师编的《c语言教程》作为学习C语言的入门教程的。书中涉及排序问题一般都以“冒泡法”和“选择法”实现。为了扩大视野,增加学习编程的兴趣,我参阅了有关书籍,整理了几种排序法,写出来同大家共勉让我们先定义一个整型数组a[n],下面用五种方法对其从小到大排序。 (1)“冒泡法” 冒泡法大家都较熟悉。其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]&a[i&&],则交换它们,一直比较到a[n]。同理对a[1],a[2],...a[n-1]处理,即完成排序。下面列出其代码: void bubble(int *a,int n) /*定义两个参数:数组首地址与数组大小*/ { int i,j, for(i=0;i&n-1;i++) for(j=i+1;j&n;j++) /*注意循环的上下限*/ if(a[i&&]&a[j]) { temp=a[i&&]; a[i&&]=a[j]; a[j]= } } 冒泡法原理简单,但其缺点是交换次数多,效率低。 下面介绍一种源自冒泡法但更有效率的方法“选择法”。 &(2)“选择法” 选择法循环过程与冒泡法一致,它还定义了记号k=i,然后依次把a[k]同后面元素比较,若a[k]&a[j],则使k=j.最后看看k=i是否还成立,不成立则交换a[k],a[i ],这样就比冒泡法省下许多无用的交换,提高了效率。 void choise(int *a,int n) { int i,j,k, for(i=0;i&n-1;i++) { k=i; /*给记号赋值*/ for(j=i+1;j&n;j++) if(a[k]&a[j ]) k=j; /*是k总是指向最小元素*/ if(i!=k) { /*当k!=i是才交换,否则a[i ] 即为最小*/ temp=a[i ]; a[i ]=a[k]; a[k]= } } } 选择法比冒泡法效率更高,但说到高效率,非“快速法”莫属,现在就让我们来了解它。 &(3)“快速法” 快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i +j)/2],即中间元素)作为参照,把比它小 的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。下面分析其代码: void quick(int *a,int i,int j) { int m,n,
m=i; n=j; k=a[(i +j)/2]; /*选取的参照*/ do { while(a[m]&k&&m&j) m++; /* 从左到右找比k大的元素*/ while(a[n]&k&&n&i) n--; /* 从右到左找比k小的元素*/ if(m&=n) { /*若找到且满足条件,则交换*/ temp=a[m]; a[m]=a[n]; a[n]= m++; n--; } }while(m&=n); if(m&j) quick(a,m,j); /*运用递归*/ if(n&i) quick(a,i,n); } &(4)“插入法” 插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。 void insert(int *a,int n) { int i,j, for(i=1;i&n;i++) { temp=a[i ]; /*temp为要插入的元素*/ j=i-1; while(j&=0&&temp&a[j]) { /*从a[i -1]开始找比a[i ]小的数,同时把数组元素向后移*/ a[j+1]=a[j ]; j--; } a[j+1]= /*插入*/ } } &(5)“shell法” shell法是一个叫 shell 的美国人与1969年发明的。它首先把相距k(k&=1)的那几个元素排好序,再缩小k值(一般取其一半),再排序,直到k=1时完成排序。下面让我们来分析其代码: void shell(int *a,int n) { int i,j,k,x; k=n/2; /*间距值*/ while(k&=1) { for(i=k;i&n;i++) { x=a[i ]; j=i-k; while(j&=0&&x&a[j]) { a[j+k]=a[j ]; j-=k; } a[j+k]=x; } k/=2; /*缩小间距值*/ } } 上面我们已经对几种排序法作了介绍,现在让我们写个主函数检验一下。 #include&stdio.h& /*别偷懒,下面的&...&代表函数体,自己加上去哦!*/ void bubble(int *a,int n) { ... } void choise(int *a,int n) { ... } void quick(int *a,int i,int j) { ... } void insert(int *a,int n) { ... } void shell(int *a,int n) { ... } /*为了打印方便,我们写一个print吧。*/ void print(int *a,int n) {
for(i=0;i&n;i++) printf(&%5d&,a[i ]); printf(&\n&); } main() { /*为了公平,我们给每个函数定义一个相同数组*/ int a1[]={13,0,5,8,1,7,21,50,9,2}; int a2[]={13,0,5,8,1,7,21,50,9,2}; int a3[]={13,0,5,8,1,7,21,50,9,2}; int a4[]={13,0,5,8,1,7,21,50,9,2}; int a5[]={13,0,5,8,1,7,21,50,9,2}; printf(&the original list:&); print(a1,10); printf(&according to bubble:&); bubble(a1,10); print(a1,10); printf(&according to choise:&); choise(a2,10); print(a2,10); printf(&according to quick:&); quick(a3,0,9); print(a3,10); printf(&according to insert:&); insert(a4,10); print(a4,10); printf(&according to shell:&); shell(a5,10); print(a5,10); } &&再补充个堆排序堆排序 1、 堆排序定义 n个关键字序列Kl,K2,…,Kn称为堆,当且仅当该序列满足如下性质(简称为堆性质): (1) ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤ ) 若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。 【例】关键字序列(10,15,56,25,30,70)和(70,56,30,25,15,10)分别满足堆性质(1)和(2),故它们均是堆,其对应的完全二叉树分别如小根堆示例和大根堆示例所示。 2、大根堆和小根堆 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆。 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆。 注意: ①堆中任一子树亦是堆。 ②以上讨论的堆实际上是二叉堆(Binary Heap),类似地可定义k叉堆。 3、堆排序特点 堆排序(HeapSort)是一树形选择排序。 堆排序的特点是:在排序过程中,将R[l..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系【参见二叉树的顺序存储结构】,在当前无序区中选择关键字最大(或最小)的记录。 4、堆排序与直接插入排序的区别 直接选择排序中,为了从R[1..n]中选出关键字最小的记录,必须进行n-1次比较,然后在R[2..n]中选出关键字最小的记录,又需要做n-2次比较。事实上,后面的n-2次比较中,有许多比较可能在前面的n-1次比较中已经做过,但由于前一趟排序时未保留这些比较结果,所以后一趟排序时又重复执行了这些比较操作。 堆排序可通过树形结构保存部分比较结果,可减少比较次数。 5、堆排序 堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。 (1)用大根堆排序的基本思想 ① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区 ② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key ③ 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。 …… 直到无序区只有一个元素为止。 (2)大根堆排序算法的基本操作: ① 初始化操作:将R[1..n]构造为初始堆; ② 每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。 注意: ①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。 ②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反:在任何时刻,堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止。 (3)堆排序的算法: void HeapSort(SeqIAst R) { //对R[1..n]进行堆排序,不妨用R[0]做暂存单元 int i; BuildHeap(R); //将R[1-n]建成初始堆 for(i=n;i&1;i--){ //对当前无序区R[1..i ]进行堆排序,共做n-1趟。 R[0]=R[1];R[1]=R[ i ];R[i ]=R[0]; //将堆顶和堆中最后一个记录交换 Heapify(R,1,i-1); //将R[1.. i-1]重新调整为堆,仅有R[1]可能违反堆性质 } //endfor } //HeapSort (4) BuildHeap和Heapify函数的实现 因为构造初始堆必须使用到调整堆的操作,先讨论Heapify的实现。 ① Heapify函数思想方法 每趟排序开始前R[l..i]是以R[1]为根的堆,在R[1]与R[i ]交换后,新的无序区R[1..i-1]中只有R[1]的值发生了变化,故除R[1]可能违反堆性质外,其余任何结点为根的子树均是堆。因此,当被调整区间是R[low..high]时,只须调整以R[low]为根的树即可。 &筛选法&调整堆 R[low]的左、右子树(若存在)均已是堆,这两棵子树的根R[2low]和R[2low+1]分别是各自子树中关键字最大的结点。若R[low].key不小于这两个孩子结点的关键字,则R[low]未违反堆性质,以R[low]为根的树已是堆,无须调整;否则必须将R[low]和它的两个孩子结点中关键字较大者进行交换,即R[low]与R[large](R[large].key=max(R[2low].key,R[2low+1].key))交换。交换后又可能使结点R[large]违反堆性质,同样由于该结点的两棵子树(若存在)仍然是堆,故可重复上述的调整过程,对以R[large]为根的树进行调整。此过程直至当前被调整的结点已满足堆性质,或者该结点已是叶子为止。上述过程就象过筛子一样,把较小的关键字逐层筛下去,而将较大的关键字逐层选上来。因此,有人将此方法称为&筛选法&。 具体的算法【参见教材】 ②BuildHeap的实现 要将初始文件R[l..n]调整为一个大根堆,就必须将它所对应的完全二叉树中以每一结点为根的子树都调整为堆。 显然只有一个结点的树是堆,而在完全二叉树中,所有序号 的结点都是叶子,因此以这些结点为根的子树均已是堆。这样,我们只需依次将以序号为 , -1,…,1的结点作为根的子树都调整为堆即可。 具体算法【参见教材】。 5、大根堆排序实例 对于关键字序列(42,13,24,91,23,16,05,88),在建堆过程中完全二叉树及其存储结构的变化情况参见【动画演示】。 6、 算法分析 堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。 堆排序的最坏时间复杂度为O(nlgn)。堆排序的平均性能较接近于最坏性能。 由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。 堆排序是就地排序,辅助空间为O(1), 它是不稳定的排序方法。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:15924次
排名:千里之外
(1)(2)(7)(4)CSharp_10_1_使用数组和集合_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
CSharp_10_1_使用数组和集合
上传于||暂无简介
大小:317.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢C语言 对比数组内容的函数_百度知道
C语言 对比数组内容的函数
对比数组内容的函数建议使用strcmp。函数原型 int strcmp(const char *s1,const char *s2);strcmp函数,比较两个字符串:设这两个字符串为str1,str2,若str1==str2,则返回零;若str1&str2,则返回正数;若str1&str2,则返回负数。实例:#include &stdio.h&#include &string.h&int main(){
char string[20];
char str[3][20];
for(i=0;i&3;i++)
gets(str[i]);
if(strcmp(str[0],str[1])&0)
strcpy(string,str[0]);
strcpy(string,str[1]);
if(strcmp(str[2],string)&0)
strcpy(string,str[2]);
printf(&\nThe largest string is%s\n&,string);
其他类似问题
为您推荐:
一个数字以响应的话就是这样:还是用strcmp函数,要一个一个对比就不需要passcheck[]数组的
#include &string.h&
#include &stdio.h&
char key();
int pass(unsigned char);
int main ()
unsigned char password[]={7,4,5,6};
//用于存储设置好的密码
if (pass(password) == 1)
printf(&ok!&);
printf(&failer&);
char key()
//接收输入一个一个的比。因为输入是缓冲输入,所以必须回车才会响应
scanf(&%c&,&p);
int pass(unsigned char password[])
for(int i = 0; i & 5; i++)
c = key();
if(password[i] != c) return 0;
//输入一个错误就提示错误退出...
int lare(int x,int y){if(x&y)z=1;elseif(x&y)z=-1;elsez=0;return(z);}圆括号改成中括号就可以了
#include &string.h&int pass(){if(memcmp(password,passcheck,sizeof(password))==0){return 1;}else{return 0;}}
用字符串比较不是更简洁明了??有现成的函数为什么不用#include &string.h&int pass(){if(strcmp(password,passcheck)==0){return 1;}else{return 0;}}
密码怎么算正确呢?是要完全和password一样吗?也就是一定要是7456才对吗?顺序也不能变吗?
c语言的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&怎么把一个int数组转化为char型数组??_百度知道
怎么把一个int数组转化为char型数组??
假定int和char数组如下:int I[2]={1,2}char c[2]={1,2}两者转换代码:int a[2] = {1, 2};char c[2];for( int i = 0; i & 2; i++ ) c[i] = a[i];Int是将一个数值向下取整为最接近的整数的函数,为取整函数。char是C&#47;C++整型数据中比较古怪的一个,其它的如int&#47;long&#47;short等不指定signed&#47;unsigned时都默认是signed,但char在标准中是unsigned,编译器可以实现为带符号的,也可以实现为不带符号的,有些编译器如pSOS的编译器,还可以通过编译开关来指定它是有符号数还是无符号数。
其他类似问题
为您推荐:
提问者采纳
for(i = 0;*234Press any key to continue*/&#92;
s[n - 1 - i] =0&#39; } s[n] = &#39; for(n = 0,s[10];.h&#include & } puts(s); ++i) {
ch = s[i];= 10; ++n) {
s[n] = num % 10 + &#39,n; 2/; i & n /int main() { 0&#39; char ch,num = 234;
s[i] = s[n - 1 - i]; return 0
.......你搞错了吧
原来是整数234,输出的是字符串234(puts(s);),错在何处?
我想问的是怎么用强制转化把一个int数组给变成一个char型数组.而且把一个整数放到数组里可以用 sprintf
或者非标准的
函数所以你能否用强制转化把一个int数组给变成一个char型数组.
&#47;*不能强制转换,整数2和字符&#39;2&#39;的值是不同的。下面通过函数调用的方法转换整形数组到字符数组。234 &== & &234&12 &== & &12&456 &== & &456&900 &== & &900&657 &== & &657&Press any key to continue*&#47;#include &stdio.h&int main() { int i,j,n,num[] = {234,12,456,900,657}; char ch,s[10]; for(j = 0; j & 5; ++j) {
printf(&%d &== & &,num[j]);
for(n = 0; num[j]; ++n) {
s[n] = num[j] % 10 + &#39;0&#39;;
num[j] &#47;= 10;
s[n] = &#39;&#92;0&#39;;
for(i = 0; i & n &#47; 2; ++i) {
ch = s[i];
s[i] = s[n - 1 - i];
s[n - 1 - i] =
printf(&&#92;&%s&#92;&&#92;n&,s); } return 0;}
原来问题出现在这整数2和字符&#39;2&#39;的值是不同的。
提问者评价
可惜财富没有了
其他3条回答
for(i=0,i,71,78如,76;10,70},73,74;i& char b[10],72;
printf(&quot,75;int main(){ int a[10]={79;%c&#92:#include & }
return 0,77;n&i++) {
b[i]=a[i];,b[i]).h&quot
用强制转换行不
不要直接逐个赋值
输出时可以强制转换
强制类型转换(char)
怎么强制...
强制转换(要转换的类型)
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 c 数组是什么类型 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信