?? 教學(xué)--第18章 數(shù)組(三) ---- 最值與排序.htm
字號(hào):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0045)http://d2school.com/bcyl/bhcpp/newls/ls18.htm -->
<HTML><HEAD><TITLE>教學(xué)--第18章 數(shù)組(三) ---- 最值與排序</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>P {
MARGIN: 1px 2px; LINE-HEIGHT: 150%
}
.節(jié)標(biāo)題 {
FONT-WEIGHT: bold; FONT-SIZE: 12pt
}
TD {
FONT-SIZE: 9pt
}
.tdtitle {
FONT-SIZE: 20pt
}
.celltopline {
BORDER-TOP: #000000 1px solid
}
.menucell {
FONT-SIZE: 10pt
}
#glowtext {
FONT-SIZE: 10pt; FILTER: glow(color=red,strength=1); WIDTH: 100%
}
A:link {
FONT: 10pt 宋體; COLOR: blue; TEXT-DECORATION: none
}
A:visited {
FONT: 10pt 宋體; COLOR: purple; TEXT-DECORATION: none
}
A:active {
FONT: 10pt 宋體; COLOR: red; TEXT-DECORATION: underline
}
A:hover {
COLOR: blue; TEXT-DECORATION: underline
}
</STYLE>
<META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD>
<BODY leftMargin=0 topMargin=3 ?>
<P> </P>
<CENTER>
<TABLE height=105 cellSpacing=4 cellPadding=4 width=760 border=0>
<TBODY>
<TR>
<TD
style="FONT-SIZE: 10pt; TEXT-INDENT: 20px; LINE-HEIGHT: 150%; FONT-FAMILY: ËÎÌå"
width="100%" height=210>
<H2>第十八章 數(shù)組(三) ---- 數(shù)組的最值與排序</H2>
<P> </P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls18.htm#18.1">18.1
求數(shù)組中的最大值</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls18.htm#18.1.1">18.1.1
基本思路與實(shí)現(xiàn)</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls18.htm#18.1.2">18.1.2
實(shí)例</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls18.htm#18.2">18.2
將數(shù)組元素排序</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls18.htm#18.2.1">18.2.1
現(xiàn)實(shí)算法與程序算法的不同</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls18.htm#18.2.2">18.2.2
冒泡排序</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls18.htm#18.2.3">18.2.3
選擇排序</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls18.htm#18.2.4">18.2.4 快速排序
(選修)</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls18.htm#18.3">18.3
小結(jié)</A><BR> </P>
<P>什么叫程序?隨著我們學(xué)習(xí)的不斷進(jìn)展,這個(gè)問題的答案不斷有新的表述。</P>
<P>今天,我們學(xué)過了“流程”,也學(xué)過了“數(shù)據(jù)類型”。</P>
<P>“流程”表達(dá)某種動(dòng)作或操作的過程;“數(shù)據(jù)”表達(dá)現(xiàn)實(shí)生活的事物。因此,程序自然可以表達(dá)為“通過流程控制,來對(duì)數(shù)據(jù)進(jìn)行正確的處理”。其實(shí)這一句話,也可以用兩個(gè)字來代替“算法”。</P>
<P>事實(shí)上有一個(gè)著名的公式,說:程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法。</P>
<P> </P>
<P>要想真正理解什么叫算法,最好的辦法還是從我們的現(xiàn)實(shí)生活入手。</P>
<P> </P>
<P>最常見的例子,就是給整理撲克牌了。給你一付打亂的撲克牌,然后讓你把它們整理,就是讓你排序。結(jié)果是:前四張是:黑桃A,紅心A,草花A、方塊A,然后是2,3……老K,最后是大小王兩張。
</P>
<P>這個(gè)過程使用的是“排序”算法。</P>
<P> </P>
<P>更簡(jiǎn)單的,給你3張牌,讓你找出其中最大的一張,這也需要一種算法。稱為“求最值”。</P>
<P> </P>
<P>你會(huì)說,這也算“算法”,3張牌往桌子上一擺,我“一眼”就能找出哪一張最大啊,我的大腦好像沒有進(jìn)行過任何計(jì)算。呵呵,這樣說可就不對(duì)了。你把這三張牌往一頭豬前面擺,擺上三年它也找不出哪一張是最大的。這可以證明,我們的大腦的確進(jìn)行了一定的演算。</P>
<P> </P>
<P>一套相同的算法,其實(shí)是連續(xù)的一段“流程控制”。可以用在不同的數(shù)據(jù)上。比如排序算法,我們可以用于整理撲克,也可以用于排出學(xué)員成績(jī)的名次,而不這兩樣數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)是什么。但是一套算法在實(shí)現(xiàn)時(shí),針對(duì)不同數(shù)據(jù)結(jié)構(gòu),有不同的實(shí)現(xiàn)。</P>
<P> </P>
<P>這一章主要就是講兩種算法在數(shù)組上的實(shí)現(xiàn),這兩種算法是:“求最值”、“排序”。</P>
<P> </P>
<H3><B><A name=18.1>18.1</A><SPAN lang=en-us> </SPAN>求數(shù)組中的最大值</B></H3>
<P>數(shù)組含有許多元素,這些元素如果是可以比較大小的,那就常常需要一種計(jì)算,求出這些元素中的最大值或最小值。求最值的算法應(yīng)用在方方面面,比如:如何找出一條街上你喜歡的那某裙子最便宜賣的那家店。比如當(dāng)早上第四節(jié)下課鈴敲響后,如何找出從教室到食堂最近的一條路等等。</P>
<H4><SPAN lang=en-us><A name=18.1.1>18.1.1</A> </SPAN>基本思路與實(shí)現(xiàn)</H4>
<P>我想大家都知道了,一到要講實(shí)例,我舉的例子就是“成績(jī)管理”。“煩不煩呢?”我看到有些同學(xué)使勁撇嘴。可不能煩啊,上一章的成績(jī)管理中,“求成績(jī)第一名”和“成績(jī)排序”這樣重要的功能還沒實(shí)現(xiàn)呢。本章的作業(yè)就是它們了。</P>
<P> </P>
<P>比如有這么一個(gè)數(shù)組,用于存儲(chǔ)幾個(gè)學(xué)生成績(jī)。現(xiàn)在老師想找出其中的第一名。</P>
<P> </P>
<P><SPAN lang=en-us>int cj[] = {80,67,76,87,78};</SPAN></P>
<P> </P>
<P>我們還是一眼“找”出了結(jié)果:87。但如果不是5個(gè)成績(jī),而是5萬個(gè)成績(jī)呢(比如首鋼的工人進(jìn)行考試的結(jié)果)?我們就不能一眼看出,而是不斷地從一個(gè)個(gè)成績(jī)里搜尋那個(gè)最大值。不管是5萬還是5個(gè),其實(shí)算法是一樣的。</P>
<P> </P>
<P>冰心老奶奶舉了個(gè)例子:同樣是從動(dòng)物園回來,有的小學(xué)生寫出讓你如臨其境的作文,而有的小學(xué)生則像是沒有去過動(dòng)物園一樣,寫得干巴巴的。</P>
<P> </P>
<P>在把你的解決問題的思路轉(zhuǎn)化為程序代碼的過程中,顯然第一步應(yīng)該做是你能夠用自然語言清楚地,準(zhǔn)確地表達(dá)出你的思路。有些人能做好這一點(diǎn),而有些人則表達(dá)得相當(dāng)困難,仿佛他不會(huì)解決問題。</P>
<P> </P>
<P>當(dāng)然這是一個(gè)雙向鍛煉的過程,如果你原來在這方面不擅長(zhǎng),跟著我在這里學(xué)習(xí)編程,慢慢的你會(huì)發(fā)現(xiàn)自已不僅學(xué)會(huì)也寫程序,而且學(xué)會(huì)了如何表達(dá)自已的想法、思路、情感……很多人說學(xué)習(xí)編程是一件快樂的事,很多人沉迷于編程,其中的一點(diǎn)奧妙,他們都不肯“泄密”,我泄密了。</P>
<P> </P>
<P>言歸正傳。大家提起精神來!</P>
<P> </P>
<P>求最大值是一個(gè)“比較”的過程。我們就說5個(gè)數(shù)的情況,看看如何找出5個(gè)數(shù)中的最大值:</P>
<P> </P>
<P><SPAN lang=en-us>2</SPAN>、3、1、4、0</P>
<P> </P>
<P>為了方便表達(dá),我們用 N 來表示最大值。</P>
<P> </P>
<P>1、首先假設(shè)第一個(gè)數(shù)就是最大值,則 N<SPAN lang=en-us> = 2;</SPAN></P>
<P>2、把N和第二個(gè)數(shù)比較,發(fā)現(xiàn)<SPAN lang=en-us> 3</SPAN> 比 <SPAN lang=en-us>N</SPAN>
大,于是讓 N <SPAN lang=en-us>= 3;</SPAN></P>
<P>3、把N和第三個(gè)數(shù)比較,發(fā)現(xiàn)<SPAN lang=en-us> </SPAN>1 不比 N 大,于是N不變。</P>
<P>4、把N和第四個(gè)數(shù)比較,發(fā)現(xiàn)<SPAN lang=en-us> </SPAN>4 比 <SPAN lang=en-us>N</SPAN>
大,于是讓 N <SPAN lang=en-us>= </SPAN>4<SPAN lang=en-us>;</SPAN></P>
<P>5、把N和第五個(gè)數(shù)比較,發(fā)現(xiàn)<SPAN lang=en-us> </SPAN>0 不比 <SPAN lang=en-us>N</SPAN>
大,于是N不變<SPAN lang=en-us>;</SPAN></P>
<P> </P>
<P>求五個(gè)數(shù)的最大值,我們用了五行話表達(dá),如果求100個(gè)數(shù)的最值呢?要比較99次,豈不是要寫100行?按照它的表達(dá),我們寫成的代碼是:</P>
<P> </P>
<P><SPAN lang=en-us>int n[5] = {2,3,1,4,0};</SPAN></P>
<P> </P>
<P><SPAN lang=en-us>int N = n[0];</SPAN></P>
<P> </P>
<P><SPAN lang=en-us>if(N > n[1])</SPAN></P>
<P><SPAN lang=en-us> N = n[1];</SPAN></P>
<P><SPAN lang=en-us>if(N > n[2])</SPAN></P>
<P><SPAN lang=en-us> N = n[2];</SPAN></P>
<P><SPAN lang=en-us>if(N > n[3])</SPAN></P>
<P><SPAN lang=en-us> N = n[3];</SPAN></P>
<P><SPAN lang=en-us>if(N > n[4])</SPAN></P>
<P><SPAN lang=en-us> N = n[4];</SPAN></P>
<P> </P>
<P>這可不叫“算法”。所以前面的表達(dá)并沒有說出真正的算法。我們要改進(jìn)它。</P>
<P> </P>
<P>1、首先假設(shè)第一個(gè)數(shù)就是最大值,則 N<SPAN lang=en-us> = 2;</SPAN></P>
<P>2、把N和下一個(gè)數(shù)比較,<FONT color=#ff0000>如果</FONT>下一個(gè)數(shù)比N大,則讓N等于該數(shù)<SPAN
lang=en-us>;</SPAN></P>
<P>3、<FONT color=#ff0000>重復(fù)</FONT>第二步,直到?jīng)]有下一個(gè)數(shù)。</P>
<P> </P>
<P>明白了嗎?算法就是這樣而來的。第一,這三行話可以適用于無論多少個(gè)數(shù)求最大值的情況,這是你的算法是否正確的一個(gè)必要條件,如果你的算法表達(dá)的長(zhǎng)短依賴于具體數(shù)據(jù)的個(gè)數(shù),那么你的算法不是通用的算法,不管是否能解決問題。第二,我們?cè)诒磉_(dá)中看到了“如果”,看到“重復(fù)”,很好,“如果”就是“分支流程”,就是<SPAN
lang=en-us>if</SPAN>或<SPAN lang=en-us>switch</SPAN>;而“重復(fù)”就是“循環(huán)流程”,是<SPAN
lang=en-us>for </SPAN>或 <SPAN lang=en-us>while </SPAN>或<SPAN lang=en-us>
do...while</SPAN>。</P>
<P> </P>
<P><SPAN lang=en-us>int n[5] = {2,3,1,4,0};</SPAN></P>
<P> </P>
<P><SPAN lang=en-us>int N = n[0];</SPAN></P>
<P> </P>
<P><SPAN lang=en-us><FONT color=#ff0000>for</FONT>( int i = <B><FONT
color=#0000ff>1</FONT></B>; i < 5; i++)</SPAN></P>
<P><SPAN lang=en-us>{</SPAN></P>
<P><SPAN lang=en-us> <FONT color=#ff0000>if</FONT>(n[i] >
N)</SPAN></P>
<P><SPAN lang=en-us> N = n[i];</SPAN></P>
<P><SPAN lang=en-us>}</SPAN></P>
<P> </P>
<P>循環(huán)從數(shù)組下標(biāo)1開始,因?yàn)閺乃惴ǖ谋硎鲋?,我們也看到了,N一開始就等于數(shù)組中的第一個(gè)數(shù),而后和“下一個(gè)數(shù)”開始比較。</P>
<P>我們可以把代碼改良,以讓它方便于應(yīng)用在任何個(gè)數(shù)的元素上。</P>
<P> </P>
<P><SPAN lang=en-us>int n[] = {2,3,1,4,0};</SPAN></P>
<P> </P>
<P><SPAN lang=en-us>int N = n[0];</SPAN></P>
<P> </P>
<P><SPAN lang=en-us>int count = sizeof(n) / sizeof(n[0]);</SPAN></P>
<P> </P>
<P><SPAN lang=en-us><FONT color=#ff0000>for</FONT>( int i = <B><FONT
color=#0000ff>1</FONT></B>; i < count; i++)</SPAN></P>
<P><SPAN lang=en-us>{</SPAN></P>
<P><SPAN lang=en-us> <FONT color=#ff0000>if </FONT>(n[i] >
N)</SPAN></P>
<P><SPAN lang=en-us> N = n[i];</SPAN></P>
<P><SPAN lang=en-us>}</SPAN></P>
<P> </P>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -