C語(yǔ)言數(shù)組教程_第1頁(yè)
C語(yǔ)言數(shù)組教程_第2頁(yè)
C語(yǔ)言數(shù)組教程_第3頁(yè)
C語(yǔ)言數(shù)組教程_第4頁(yè)
C語(yǔ)言數(shù)組教程_第5頁(yè)
已閱讀5頁(yè),還剩72頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C語(yǔ)言數(shù)組教程C語(yǔ)言數(shù)組教程 基本數(shù)據(jù)類型基本數(shù)據(jù)類型:int, float/double, char 數(shù)據(jù)的處理數(shù)據(jù)的處理:根據(jù)問(wèn)題需求,先作幾個(gè)的定義,然后對(duì)這些變量賦值并作相應(yīng)的運(yùn)算即得結(jié)果 例如:輸入10個(gè)實(shí)數(shù),求其平均值。#include int main三 int i; float num, sum=0; printf(input 10 numbers: n); for (i=1; i=10; i+) scanf(%f,&num); sum +=num; printf(average =%.2f n, sum/10.); return 0; 一個(gè)人n門課的成績(jī)?cè)鯓哟鎯?chǔ)和處理

2、? 一個(gè)班n門課的成績(jī)?cè)鯓哟鎯?chǔ)和處理? 如何從鍵盤輸入100個(gè)數(shù)然后按相反順序輸出? 輸入10個(gè)數(shù),將高于平均值的數(shù)輸出? .這些數(shù)據(jù)的特點(diǎn):1.具有相同的數(shù)據(jù)類型2.使用過(guò)程中需要保留原始數(shù)據(jù) 為了方便的使用這些數(shù)據(jù),C語(yǔ)言提供了一種構(gòu)造數(shù)據(jù)類型:數(shù)組。一定要理解并用好數(shù)組! 數(shù)組是具有相同類型的數(shù)據(jù)的順序集合 數(shù)組可以在內(nèi)存中連續(xù)存儲(chǔ)多個(gè)元素Rate1.53.20.0945.39870123數(shù)組元素?cái)?shù)組元素下標(biāo)下標(biāo)Rate0 Rate1 Rate2 Rate3datatype arrayNamesize;類型說(shuō)明符類型說(shuō)明符int、char、float 數(shù)組名數(shù)組名常量表達(dá)式:常量表達(dá)式:

3、數(shù)組大小數(shù)組大小int num50;char list_of_initials20;double pressure_level6;#define LIMIT 20. . . int emp_codesLIMIT;數(shù)組和變量一樣,必須先定義后使用;數(shù)組和變量一樣,必須先定義后使用;數(shù)組大小定義好后,數(shù)組大小定義好后,將不能改變;將不能改變;數(shù)組大小最好用宏來(lái)定義,以適應(yīng)未來(lái)可能的變化數(shù)組大小最好用宏來(lái)定義,以適應(yīng)未來(lái)可能的變化 C89:定義數(shù)組時(shí)不能使用變量定義數(shù)組的大小,即使在此之前變量已經(jīng)賦值,只能使用整形常量定義數(shù)組的大小 C99:允許用變量定義數(shù)組的大小int array(10);int

4、 n=5; float scoren;int n;scanf(%d, &n);int datan;char str ;float char10;數(shù)組下標(biāo)從0開(kāi)始數(shù)組元素在內(nèi)存中按順按順序連續(xù)存放序連續(xù)存放數(shù)組名代表數(shù)組的首地?cái)?shù)組名代表數(shù)組的首地址址,即score的值與score0的地址值相同內(nèi)存內(nèi)存score數(shù)組數(shù)組高地址高地址低地址低地址12345score0score1score2score3score4數(shù)組元素?cái)?shù)組元素序號(hào)序號(hào)int score5;score數(shù)組元素就是變量C語(yǔ)言中,不允許引用數(shù)組進(jìn)行運(yùn)算,只能引用數(shù)組元素基本形式:數(shù)組名數(shù)組名下標(biāo)表達(dá)式下標(biāo)表達(dá)式;說(shuō)明:下標(biāo)表達(dá)

5、式的值必須為整型下標(biāo)從0開(kāi)始,最大下標(biāo)為數(shù)組長(zhǎng)度減1 是下標(biāo)運(yùn)算符,引用數(shù)組元素時(shí)根據(jù)數(shù)組首地址和下標(biāo)計(jì)算出該元素的實(shí)際地址,然后取出該地址的內(nèi)容如引用score2:計(jì)算202X+2*4=202X取出地址202X的內(nèi)容87907786score0score1score2score32000H2004H2008H200CH例如: int a5; a0=20; a4=2*a0; int a10; scanf(%d,&a10); /*下標(biāo)越界*/ 編譯程序不檢查是否越界 下標(biāo)越界,將訪問(wèn)數(shù)組以外的空間,可能帶來(lái)嚴(yán)重后果#include int main三 int a = 1, c = 2,

6、b5 = 0, i; printf(%p, %p, %pn, b, &c, &a); for (i=0; i=8; i+) bi = i; printf(%d , bi); printf(nc=%d, a=%d, i=%dn, c, a, i); return 0; b0b1b2b3b4 c a ib81234560784044484c5054585c6064686c9運(yùn)行程序或單步執(zhí)行觀察變量變化情況可以看到,變量c和a的值因數(shù)組越界而被悄悄破壞了 初始化:在定義數(shù)組時(shí)給數(shù)組元素賦初值 形式:數(shù)據(jù)類型 數(shù)組名稱數(shù)組長(zhǎng)度=數(shù)值列表 在定義數(shù)組時(shí),對(duì)全部數(shù)組元素賦初值: 例如:i

7、nt a5=0,1,2,3,4; 此時(shí)也可省略數(shù)組長(zhǎng)度 例如:int a =0,1,2,3,4; /只寫int a;是錯(cuò)誤的 在定義數(shù)組時(shí),對(duì)部分?jǐn)?shù)組元素賦初值: 例如:int a5=0,1,2; /數(shù)組其余元素自動(dòng)賦0 當(dāng)初值的個(gè)數(shù)多于數(shù)組元素個(gè)數(shù)時(shí),編譯出錯(cuò) 例如:int a5=0,1,2,3,4,5;l只能逐個(gè)對(duì)數(shù)組元素進(jìn)行操作(字符數(shù)組例外)l一般一維數(shù)組的處理用一重循環(huán)來(lái)實(shí)現(xiàn),用循環(huán)變量的值對(duì)應(yīng)數(shù)組元素的下標(biāo)動(dòng)態(tài)賦值方法:int a10,i;輸入第3個(gè)數(shù)組元素:scanf( %d,&a2);輸入整個(gè)數(shù)組元素:for (i=0;i10;i+) scanf(%d , &a

8、i );輸出方法:輸出第1個(gè)數(shù)組元素:printf(%d, a0);輸出整個(gè)數(shù)組元素:for (i=0;i10;i+) printf(%d, ai );【例1】 輸入10個(gè)整數(shù),輸出它們的和,并逆序打印這些數(shù)#include #define N 10 /數(shù)組程序推薦該用法int main 三 int i,sum=0,dataN; for( i=0; i=0; i- ) printf( %d, datai ) ; printf(n); return 0; 【例2】用數(shù)組來(lái)求Fibonacci數(shù)列前20項(xiàng)#include #define N 20int main三 int i,fN=1,1; fo

9、r(i=2;iN;i+) fi=fi-2+fi-1; for (i=0; iN ;i+) if (i%4=0) printf(n); printf(%6d,fi); printf(n); return 0; 1 (n=1)Fn = 1 (n=2) Fn-2+Fn-1 (n3)Fibonacci數(shù)列:數(shù)列:1,1,2,3,5,8,13,21,34 數(shù)組是一組相同類型的數(shù)據(jù)組成的有限集合 數(shù)組是可以在內(nèi)存中連續(xù)存儲(chǔ)多個(gè)元素的結(jié)構(gòu)數(shù)組中的數(shù)據(jù)稱為數(shù)組元素,數(shù)組元素個(gè)數(shù)稱為數(shù)組長(zhǎng)度 數(shù)組元素用數(shù)組名和元素下標(biāo)表示,如score0, score1score859377880123score 4 數(shù)組數(shù)組

10、名名(首地址首地址)下標(biāo)標(biāo)明了元素在數(shù)組下標(biāo)標(biāo)明了元素在數(shù)組中的位置中的位置 ,從,從0開(kāi)始開(kāi)始數(shù)組元素?cái)?shù)組元素下標(biāo)下標(biāo)數(shù)組大小數(shù)組大小int num42;4 X 2 = 8數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)組名數(shù)組名常量表達(dá)式常量表達(dá)式1 常量表達(dá)式常量表達(dá)式2;為了便于理解,二維數(shù)組一般理解為幾行幾列的矩陣數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)組名數(shù)組名行大小行大小列大小列大小;num00num01num10num11num20num21num30num31錯(cuò)誤的定義:錯(cuò)誤的定義:int a3,4, b(3,4);int c , d(3)(4);int a23;a0a1a10a11a12a00a01a02二維數(shù)組元素在內(nèi)

11、存中的存放順序:二維數(shù)組元素在內(nèi)存中的存放順序:先按行存放,再按列存放先按行存放,再按列存放,即,即先順序存放第先順序存放第0行的元素行的元素再存放第再存放第1行的元素,行的元素,a00a01a02a10a11a12 二維數(shù)組元素的引用形式: 例如:int a34;a00=3;a01=a00+10;a34=5; /*下標(biāo)越界*/數(shù)組名數(shù)組名行下標(biāo)行下標(biāo) 列下標(biāo)列下標(biāo);按行賦初值:例如:int a23=1, 2, 3, 4, 5, 6; int a23=1, 4, 5;按數(shù)組元素存放順序賦初值:例如:int a23=1, 2, 3, 4, 5, 6; int a23=1, 2, 3;省略行數(shù)(根

12、據(jù)初值個(gè)數(shù)和列聲明自動(dòng)確定行數(shù))例如:int b3=1, 2, 3, 4, 5, 6, 7, 8, 9,10; int c3=1, 2, 3; 1 2 34 5 61 2 30 0 01 0 04 5 04行行1 2 03 0 0 下列二維數(shù)組的定義都是錯(cuò)誤的:int a, b3, c2;int arr2 = 1,2,3, 4,5,6;int b23=1, 2, 3, 4, 5, 6, 7, 8; 一般二維數(shù)組的處理用二重循環(huán)來(lái)實(shí)現(xiàn),用循環(huán)變量的值控制數(shù)組元素的下標(biāo)int a34,i,j;輸入方法:輸入方法:輸入輸入第第i i行第行第j j列列元素的值:元素的值:scanf(“%dscanf(

13、“%d”, &”, &aij);aij);輸入整個(gè)數(shù)組元素:輸入整個(gè)數(shù)組元素:for (i=0for (i=0; i3; i; i3; i+)+) for(j=0 for(j=0; j4; j; j4; j+)+) scanf(“%d scanf(“%d”, &”, &aijaij); );輸出方法:輸出方法:輸出第輸出第i i行第行第j j列列元素的值:元素的值:printfprintf( (“ “%d%d“ “, ai, aij);j);輸出整個(gè)數(shù)組元素:輸出整個(gè)數(shù)組元素:for (for (i=0; i3; ii=0; i3; i+)+) for(j=0

14、for(j=0; j4; j; j4; j+)+) printf(“%d printf(“%d”, ai”, aij j ); );為一個(gè)為一個(gè)3行行4列的二維數(shù)組輸入列的二維數(shù)組輸入/輸出數(shù)據(jù)輸出數(shù)據(jù)int main三 int a34, i, j; for (i=0; i3; i+) for (j=0; j4; j+) scanf(“%d”,&aij); for (i=0; i3; i+) for (j=0; j4; j+) printf(“%5d”, aij); printf(“n”); return 0; 【例3】將二維數(shù)組a轉(zhuǎn)置存到二維數(shù)組b中654321a635241ba01

15、b10a12b21設(shè)行下標(biāo)為i,列下標(biāo)為j,則: bji aij#include int main三 int a23=1,2,3,4,5,6, b32, i, j; printf(數(shù)組a : n); for (i=0; i2 ; i+) for (j=0 ; j3; j+) printf(%5d, aij); printf(n); for (i=0; i2 ; i+) for (j=0 ; j3; j+) bji=aij; /* 轉(zhuǎn)置 */ printf(數(shù)組 b: n); for (i=0; i=2;i+) for (j=0 ; j=1 ; j+) printf(%5d, bij); pri

16、ntf(n); return 0; 【例4】從鍵盤上為一個(gè)55整型數(shù)組賦值,找出其中的最小值和最大值(平均值,上三角),并顯示出來(lái)分析: 設(shè)最大值為max,最小值為min. 1、令max =a00 min =a00 2、對(duì)0=row5,0=col5 (顯然要用二重循環(huán)): 如果arowcolmax,則將其存入max中。 3、輸出min和max。#include int main 三 int row,col,a55,max,min; printf(請(qǐng)輸入5個(gè)整數(shù):); for(row=0; row5; row+) for(col=0; col5; col+) scanf(%d,&arow

17、col); min=a00;max=a00; for(row=0; row5; row+) for(col=0; col5; col+) if (arowcolmax) max=arowcol; printf(min=%d ,min); printf(max=%dn,max); return 0; 數(shù)組是由同一種數(shù)據(jù)類型的元素系列構(gòu)成 數(shù)組元素按順序在內(nèi)存中連續(xù)存儲(chǔ),并通過(guò)使用數(shù)組下標(biāo)(或索引)來(lái)訪問(wèn),首元素的索引值為0 數(shù)組必須先聲明然后才能使用。聲明一個(gè)數(shù)組只是為該數(shù)組留出連續(xù)內(nèi)存空間,并不會(huì)為其賦任何值 一維數(shù)組定義:數(shù)據(jù)類型 數(shù)組名數(shù)組大小 二維數(shù)組可以看作是一維數(shù)組的數(shù)組 一維數(shù)組可

18、用一個(gè)循環(huán)動(dòng)態(tài)賦值,而二維數(shù)組可用二重嵌套循環(huán)動(dòng)態(tài)賦值C把數(shù)組名解釋為該數(shù)組第1個(gè)元素(a0)的首地址,并且C編譯器不檢查所引用的數(shù)組元素下標(biāo)是否越界 根據(jù)實(shí)實(shí)參類型參類型的不同,有兩種傳遞方式 值傳遞 地址傳遞1、值傳遞方式 類型 簡(jiǎn)單變量(數(shù)組之前所學(xué)的變量類型) 方式 調(diào)用函數(shù)時(shí):將實(shí)參值值復(fù)制一份傳給函數(shù)的形參 調(diào)用結(jié)束后:原值不變?cè)挡蛔儯ㄗ兊闹皇歉北荆?特點(diǎn) 實(shí)參與形參占用不同的不同的內(nèi)存單元#include void swap ( int x, int y ) int temp; temp = x; x = y; y = temp;int main ( ) int a, b; s

19、canf(%d%d,&a,&b); swap(a, b); printf(n%d,%dn,a,b); .20002010201420042008200C5變量變量a 變量變量b(main)9 變量變量temp 變量變量y 變量變量x(swap)55959COPY2、地址傳遞方式 類型 數(shù)組、指針、結(jié)構(gòu)體 方式 調(diào)用函數(shù)時(shí):將實(shí)參地址地址復(fù)制一份傳給函數(shù)的形參 調(diào)用結(jié)束后:原原值改變值改變 特點(diǎn) 形參與實(shí)參占用相同的相同的內(nèi)存單元值傳遞值傳遞地址傳遞地址傳遞類型 簡(jiǎn)單類型數(shù)組、指針、結(jié)構(gòu)體方式調(diào)用函數(shù)時(shí):將實(shí)參值復(fù)制一份傳給函數(shù)的形參調(diào)用結(jié)束后:原值不變(變的只是副本)調(diào)用函數(shù)時(shí)

20、:將實(shí)參地址復(fù)制一份傳給函數(shù)的形參調(diào)用結(jié)束后:原值改變特點(diǎn)實(shí)參與形參占用不同的內(nèi)存單元形參與實(shí)參占用相同的內(nèi)存單元簡(jiǎn)記為:傳遞簡(jiǎn)單類型是值傳遞;傳遞其他類型是地址傳遞 1、一維數(shù)組元素作函數(shù)參數(shù) 【例】求5個(gè)整數(shù)中的最小數(shù)#include #define N 5int main( ) int aN,i,m; for(i=0;iN;i+) scanf(%d,&ai); m=a0; for(i=1;iN;i+) m=min(m,ai); printf(min=%dn,m); return 0; int min(int x,int y) return (xy?x:y);傳遞的是數(shù)組元素的值,

21、值,所以是值值傳遞方式 2、一維數(shù)組名作函數(shù)參數(shù)重點(diǎn) 定義階段: 形參應(yīng)定義為數(shù)組形式,形參數(shù)組的長(zhǎng)度可以省略,但是不能省略,否則就不是數(shù)組形式 如 void fun(int myArray, int length) 調(diào)用階段: 實(shí)參為數(shù)組名 如: fun(myArray); 數(shù)組名表示數(shù)組在內(nèi)存中的起始地址,傳遞的是數(shù)組名,所以是地址傳遞方式#include float average(int stu10, int n);int main三 int score10, i; float av; printf(Input 10 scores:n); for( i=0; i10; i+ ) sca

22、nf(%d, &scorei); av=average(score,10); printf(Average is:%.2f, av); return 0;float average(int stu10, int n) int i; float total=0; for( i=0; i0 ? total/n : -1; /更安全更安全#include #define N 40int ReadScore(int score);int FindMax(int score, int n);int main三 int scoreN, max, n;n = ReadScore(score);pri

23、ntf(Total students are %dn, n);max = FindMax(score, n);printf(The highest score is %dn, max); return 0;max(i=0)max(i=2)max(i=3) 假設(shè)其中的一個(gè)學(xué)生成績(jī)?yōu)樽罡適axScore = score0; 對(duì)所有學(xué)生成績(jī)進(jìn)行比較,即 for (i=1; i maxScore 則修改maxScore值為scorei 打印最高分maxScore 有一個(gè)班,30個(gè)學(xué)生,4門課程成績(jī),要求:利用函數(shù)計(jì)算每個(gè)學(xué)生的平均分并在主函數(shù)中輸出平均分。 思路 使用二維數(shù)組作為參數(shù)#include

24、#define SN 30#define CN 4int main三int i,j;float scoreSNCN,sum,avgSN;for(i=0;iSN;i+) sum=0;for(j=0;jCN;j+) scanf(%f,&scoreij); sum=sum+scoreij;avgi=sum/CN;for(i=0;iSN;i+)printf(%.2fn,avgi);return 0;#include #define SN 30#define CN 4int main三 int i,j; float scoreSNCN,avgSN; for(i=0;iSN;i+) for(j=0

25、;jCN;j+) scanf(%f,&scoreij); fun(score,avg); for(i=0;iSN;i+) printf(%.2fn,avgi); return 0;void fun(float aCN,float average) float sum; int i,j; for(i=0;iSN;i+) sum=0; for(j=0;jCN;j+) sum=sum+aij; averagei=sum/CN; 二維數(shù)組作函數(shù)參數(shù)方法與一維數(shù)組相同需要注意的是:形參為二維數(shù)組時(shí),可以省略第一維長(zhǎng)度說(shuō)明,但是不能省略第二維的長(zhǎng)度說(shuō)明。 冒泡排序, Bubble Sort 選擇排

26、序, Selection Sort 雙向冒泡排序, Shaker Sort 插入排序, Insertion Sort 希爾排序, Shell Sort, 也稱縮小增量排序 歸并排序, Merge Sort堆排序, Heap Sort 快速排序, Quick Sort 猴子排序, Bogo Sort 排序算法動(dòng)畫比較演示 :/ / :/交換法排序 for (i=0; in-1; i+) for (j=i+1; j scorei) 交換成績(jī)scorej和scorei temp = scorej;scorej = scorei; scorei = temp; tempscorejscorei ?70

27、50705070#include #define N 10int main 三 int i, j, t, aN; printf(順序輸入%d個(gè)整數(shù): , N) ; for(i=0; iN; i+) scanf(%d, &ai) ; printf(原序列為:n); for(i=0; iN; i+) printf( %d, ai) ; for(i=0; iN-1; i+) /*控制比較的趟數(shù)*/ for(j=i+1; jai) t=ai; ai=aj; aj=t; printf(n排序后的序列為:n); for(i=0; iN; i+) printf( %d, ai); printf(n)

28、; return 0;#include #define N 10void printArray(int a);void sort(int a,int n);int main( ) int a=11,22,63,97,58, 80,45,32,73,36; printf(Before sort:n); printArray(a); sort(a,N); printf(After sort:n); printArray(a); return 0; void printArray(int b) int i; for (i=0;iN;i+) printf(%5d,bi); printf(n);void

29、 sort(int b, int n) int i,j,t; for (i=0;in-1;i+) for (j=i+1;jbi) t=bi; bi=bj; bj=t; 實(shí)參用數(shù)組實(shí)參用數(shù)組名,相當(dāng)于:名,相當(dāng)于:把把a(bǔ)的地址傳給了形參的地址傳給了形參b形參用數(shù)組定義形參用數(shù)組定義k=1k=2k=0k=1k=3k=4k=3k=4for (i=0; in-1; i+) k = i; for (j=i+1; j scorek)記錄此輪比較中最高分的元素下標(biāo)k=j; 若k中記錄的最大數(shù)不在位置i,則交換成績(jī)scorek和scorei, 交換學(xué)號(hào)numk和numi; void DataSort(int

30、score, long num, int n) int i, j, k, temp1; long temp2; for (i=0; in-1; i+) k = i; for (j=i+1; j scorek) k = j; /*記錄最大數(shù)下標(biāo)位置*/ if (k != i) /*若最大數(shù)不在下標(biāo)位置i*/ temp1 = scorek; scorek = scorei; scorei = temp1; temp2 = numk; numk = numi; numi = temp2; 【例4】用冒泡法對(duì)數(shù)組元素進(jìn)行排序,排序后元素按數(shù)值從小到大順序排列 冒泡排序: 依次比較相鄰的兩個(gè)數(shù),將大數(shù)上

31、升(放右邊) 第一趟:首先比較第1個(gè)和第2個(gè)數(shù),將大數(shù)放右邊。然后比較第2個(gè)數(shù)和第3個(gè)數(shù),如此繼續(xù),直至比較最后兩個(gè)數(shù),結(jié)果是將最大數(shù)放最右邊。 第二趟:重復(fù)以上過(guò)程,仍從第一對(duì)數(shù)開(kāi)始比較,將大數(shù)放右邊,一直比較到倒數(shù)第二對(duì)數(shù),第二趟結(jié)束,得到一個(gè)次大數(shù)。 如此下去,直至最終完成排序。 由于排序過(guò)程如同冒氣泡,所以稱作冒泡排序 for (i=0; in-1; i+) for (j=0; j aj+1) 交換aj和aj+1;for (i=0; in-1; i+)k = i; for (j=i+1; j ak) k = j; /*記錄最大數(shù)下標(biāo)位置*/if (k!= i) /*若最大數(shù)不在下標(biāo)位置

32、i*/交換aj和ak;for (i=0; in-1; i+) for (j=i+1; j ai) 交換aj和ai“; 基本思想:通過(guò)一趟排序?qū)⒋庞涗浄指舫瑟?dú)立的兩部分,其中一部分記錄的關(guān)鍵字均比另一部分的關(guān)鍵字小,則可分別對(duì)這兩部分記錄繼續(xù)進(jìn)行排序,以達(dá)到整個(gè)序列有序。 整個(gè)排序過(guò)程需要三步:1. 尋找一個(gè)中心元素(通常為第一個(gè)數(shù))2. 所有小于中心點(diǎn)的元素,都移到中心點(diǎn)的左邊;所有大于中心點(diǎn)的元素,都移到中心點(diǎn)的右邊。3. 對(duì)中心點(diǎn)左邊和右邊的兩個(gè)子集,不斷重復(fù)第一步和第二步,直到所有子集只剩下一個(gè)元素為止。 需要解決的問(wèn)題 當(dāng)已知中心元素的前提下,怎樣將其他元素劃分好?(即:大于中心點(diǎn)在

33、之后,小于中心點(diǎn)在之前)i012345i=0i=1j=5j=5ji=1j=3i=1j=4i=2j=3i=2j=2算法終止算法終止該算法有沒(méi)有可以改進(jìn)的地方? 通過(guò)動(dòng)畫,可以看出每次中心元素都要交換。根據(jù)劃分的思想最后位置一定是中心元素i012345i=0i=1j=5j=5ji=1j=3i=1j=4i=2j=3i=2j=2算法終止算法終止可以申請(qǐng)一個(gè)變量保存中心元素,以避免交換void QuickSort(int *arr, int left, int right) int i,j,temp; if(lefttemp & ij) j-; /從右向左找第1小于中心點(diǎn)的位置j if(ij)

34、/找到了,位置為j arri = arrj; i+; /將第j個(gè)元素置于左端并重置i while(arritemp & ij) i+; /從左向右找第1個(gè)大于中心點(diǎn)的位置i if(ij) /找到了,位置為i arrj = arri; /將第i個(gè)元素置于右端并重置j j-; while(i!=j); arri = temp; /將中心點(diǎn)放入它的最終位置,本次劃分結(jié)束 QuickSrt(arr, left, i-1); /對(duì)中心點(diǎn)左半部遞歸調(diào)用本函數(shù) QuickSort(arr, i+1, right); /對(duì)中心點(diǎn)右半部遞歸調(diào)用本函數(shù) *arr為數(shù)組指針,下一章講解 在頭文件中,提供了一

35、個(gè)快速排序函數(shù)qsort,它的函數(shù)原型如下:void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *);四個(gè)參數(shù)分別是: 1 待排序數(shù)組首地址2 數(shù)組中待排序元素?cái)?shù)量 3 各元素的占用空間大小 4 指向函數(shù)的指針,用于確定排序的順序 要求學(xué)完指針后能熟練調(diào)用,有余力的同學(xué)可以先學(xué)習(xí)先用 表中除首元素和尾元素外,每個(gè)元素都有且只有一個(gè)前驅(qū);有且只有一個(gè)后繼。 a0ai-1,ai,ai+1aN-1 數(shù)組和鏈表是線性表的兩種實(shí)現(xiàn)方式。 鏈表選學(xué)例1假設(shè)數(shù)組a中已有5個(gè)整數(shù),要插入一個(gè)數(shù)x到第1個(gè)數(shù)前

36、面并保持這5個(gè)數(shù)的前后關(guān)系不變,試編程實(shí)現(xiàn)分析:分析:數(shù)組最終存放數(shù)組最終存放6個(gè)元素,應(yīng)定義數(shù)組個(gè)元素,應(yīng)定義數(shù)組a6元素下標(biāo)012345初始狀態(tài)12345最后一個(gè)元素沒(méi)有使用移動(dòng)過(guò)程12345從右邊起各元素依次右移第一個(gè)元素已不再使用插入元素12345首元素位置插入數(shù)XX432151#include #define N 5int main三int i, x, aN+1 ;printf(Input %d numbers:, N ) ;for( i=0; iN; i+ ) scanf(%d, &ai) ;printf( Before insert: );for( i=0; i0; i-

37、 ) ai = ai-1 ;ai = x ; / a0=xprintf(After insert: );for( i=0; iN+1; i+ )printf(%d, ai);printf(n); return 0; 后移后移并并插插入數(shù)據(jù)入數(shù)據(jù) 【例2】隨機(jī)產(chǎn)生20個(gè)整數(shù)保存在數(shù)組中,試用順序查找方法查找某個(gè)整數(shù)。 分析: 產(chǎn)生隨機(jī)數(shù):使用函數(shù)srand三和rand三 順序查找:從數(shù)組的第1個(gè)元素開(kāi)始逐一與要查找的數(shù)據(jù)進(jìn)行比較,如果有一個(gè)元素與之相同,就是找到了,查找過(guò)程即可結(jié)束。如果所有元素都不同于要查找的數(shù)據(jù),則沒(méi)找到。#include #include #include #define

38、N 20int main ( ) int i, x, aN,find=0; srand(time(NULL); /*保證每次產(chǎn)生不同的隨機(jī)數(shù)序列*/ for(i=0; iN; i+) /*產(chǎn)生N個(gè)小于100的隨機(jī)數(shù)*/ ai = rand( )%100; if(i%10=0) printf(n); printf(%6d,ai); printf(n要查找的整數(shù)是? ); scanf(%d, &x ); for(i=0; iN; i+) if(x=ai) find=1; break; if(find)printf(找到了,%d是數(shù)組的第%d個(gè)元素。n,x,i+1); else printf

39、(沒(méi)有找到%d。n , x);return 0;一旦找到,設(shè)置find=1,通過(guò)break語(yǔ)句跳出循環(huán) 【例3】設(shè)整型數(shù)組a10 ,刪去某數(shù)x,并使原來(lái)的順序關(guān)系不變,試編程實(shí)現(xiàn)。 問(wèn)題分析: 主要解決兩個(gè)關(guān)鍵問(wèn)題: 查找某個(gè)元素是否等于x:用順序查找法 找到后刪除該元素:該元素后的數(shù)組元素逐個(gè)向前移動(dòng)一個(gè)位置#include #define N 10int main 三 int i, k, x, aN, del=0, m=0 ; printf(輸入%d個(gè)整數(shù):, N) ; for(i=0; iN; i+) scanf(%d, &ai) ; printf(原數(shù)組為:); for(i=0; iN; i+) printf( %d, ai) ; printf(n輸入要?jiǎng)h除的數(shù): ); scanf(%d, &x ); for(i=0; iN; i+) if(ai=x) for(k=i+1;kN;k+) ak-1=ak; del=1; m+ ; if (del) pr

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論