?? 教學--第18章 數組(三) ---- 最值與排序.htm
字號:
<!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>教學--第18章 數組(三) ---- 最值與排序</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>P {
MARGIN: 1px 2px; LINE-HEIGHT: 150%
}
.節標題 {
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>第十八章 數組(三) ---- 數組的最值與排序</H2>
<P> </P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls18.htm#18.1">18.1
求數組中的最大值</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls18.htm#18.1.1">18.1.1
基本思路與實現</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls18.htm#18.1.2">18.1.2
實例</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls18.htm#18.2">18.2
將數組元素排序</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls18.htm#18.2.1">18.2.1
現實算法與程序算法的不同</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
小結</A><BR> </P>
<P>什么叫程序?隨著我們學習的不斷進展,這個問題的答案不斷有新的表述。</P>
<P>今天,我們學過了“流程”,也學過了“數據類型”。</P>
<P>“流程”表達某種動作或操作的過程;“數據”表達現實生活的事物。因此,程序自然可以表達為“通過流程控制,來對數據進行正確的處理”。其實這一句話,也可以用兩個字來代替“算法”。</P>
<P>事實上有一個著名的公式,說:程序 = 數據結構 + 算法。</P>
<P> </P>
<P>要想真正理解什么叫算法,最好的辦法還是從我們的現實生活入手。</P>
<P> </P>
<P>最常見的例子,就是給整理撲克牌了。給你一付打亂的撲克牌,然后讓你把它們整理,就是讓你排序。結果是:前四張是:黑桃A,紅心A,草花A、方塊A,然后是2,3……老K,最后是大小王兩張。
</P>
<P>這個過程使用的是“排序”算法。</P>
<P> </P>
<P>更簡單的,給你3張牌,讓你找出其中最大的一張,這也需要一種算法。稱為“求最值”。</P>
<P> </P>
<P>你會說,這也算“算法”,3張牌往桌子上一擺,我“一眼”就能找出哪一張最大啊,我的大腦好像沒有進行過任何計算。呵呵,這樣說可就不對了。你把這三張牌往一頭豬前面擺,擺上三年它也找不出哪一張是最大的。這可以證明,我們的大腦的確進行了一定的演算。</P>
<P> </P>
<P>一套相同的算法,其實是連續的一段“流程控制”。可以用在不同的數據上。比如排序算法,我們可以用于整理撲克,也可以用于排出學員成績的名次,而不這兩樣數據的數據結構是什么。但是一套算法在實現時,針對不同數據結構,有不同的實現。</P>
<P> </P>
<P>這一章主要就是講兩種算法在數組上的實現,這兩種算法是:“求最值”、“排序”。</P>
<P> </P>
<H3><B><A name=18.1>18.1</A><SPAN lang=en-us> </SPAN>求數組中的最大值</B></H3>
<P>數組含有許多元素,這些元素如果是可以比較大小的,那就常常需要一種計算,求出這些元素中的最大值或最小值。求最值的算法應用在方方面面,比如:如何找出一條街上你喜歡的那某裙子最便宜賣的那家店。比如當早上第四節下課鈴敲響后,如何找出從教室到食堂最近的一條路等等。</P>
<H4><SPAN lang=en-us><A name=18.1.1>18.1.1</A> </SPAN>基本思路與實現</H4>
<P>我想大家都知道了,一到要講實例,我舉的例子就是“成績管理”。“煩不煩呢?”我看到有些同學使勁撇嘴。可不能煩啊,上一章的成績管理中,“求成績第一名”和“成績排序”這樣重要的功能還沒實現呢。本章的作業就是它們了。</P>
<P> </P>
<P>比如有這么一個數組,用于存儲幾個學生成績。現在老師想找出其中的第一名。</P>
<P> </P>
<P><SPAN lang=en-us>int cj[] = {80,67,76,87,78};</SPAN></P>
<P> </P>
<P>我們還是一眼“找”出了結果:87。但如果不是5個成績,而是5萬個成績呢(比如首鋼的工人進行考試的結果)?我們就不能一眼看出,而是不斷地從一個個成績里搜尋那個最大值。不管是5萬還是5個,其實算法是一樣的。</P>
<P> </P>
<P>冰心老奶奶舉了個例子:同樣是從動物園回來,有的小學生寫出讓你如臨其境的作文,而有的小學生則像是沒有去過動物園一樣,寫得干巴巴的。</P>
<P> </P>
<P>在把你的解決問題的思路轉化為程序代碼的過程中,顯然第一步應該做是你能夠用自然語言清楚地,準確地表達出你的思路。有些人能做好這一點,而有些人則表達得相當困難,仿佛他不會解決問題。</P>
<P> </P>
<P>當然這是一個雙向鍛煉的過程,如果你原來在這方面不擅長,跟著我在這里學習編程,慢慢的你會發現自已不僅學會也寫程序,而且學會了如何表達自已的想法、思路、情感……很多人說學習編程是一件快樂的事,很多人沉迷于編程,其中的一點奧妙,他們都不肯“泄密”,我泄密了。</P>
<P> </P>
<P>言歸正傳。大家提起精神來!</P>
<P> </P>
<P>求最大值是一個“比較”的過程。我們就說5個數的情況,看看如何找出5個數中的最大值:</P>
<P> </P>
<P><SPAN lang=en-us>2</SPAN>、3、1、4、0</P>
<P> </P>
<P>為了方便表達,我們用 N 來表示最大值。</P>
<P> </P>
<P>1、首先假設第一個數就是最大值,則 N<SPAN lang=en-us> = 2;</SPAN></P>
<P>2、把N和第二個數比較,發現<SPAN lang=en-us> 3</SPAN> 比 <SPAN lang=en-us>N</SPAN>
大,于是讓 N <SPAN lang=en-us>= 3;</SPAN></P>
<P>3、把N和第三個數比較,發現<SPAN lang=en-us> </SPAN>1 不比 N 大,于是N不變。</P>
<P>4、把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和第五個數比較,發現<SPAN lang=en-us> </SPAN>0 不比 <SPAN lang=en-us>N</SPAN>
大,于是N不變<SPAN lang=en-us>;</SPAN></P>
<P> </P>
<P>求五個數的最大值,我們用了五行話表達,如果求100個數的最值呢?要比較99次,豈不是要寫100行?按照它的表達,我們寫成的代碼是:</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>這可不叫“算法”。所以前面的表達并沒有說出真正的算法。我們要改進它。</P>
<P> </P>
<P>1、首先假設第一個數就是最大值,則 N<SPAN lang=en-us> = 2;</SPAN></P>
<P>2、把N和下一個數比較,<FONT color=#ff0000>如果</FONT>下一個數比N大,則讓N等于該數<SPAN
lang=en-us>;</SPAN></P>
<P>3、<FONT color=#ff0000>重復</FONT>第二步,直到沒有下一個數。</P>
<P> </P>
<P>明白了嗎?算法就是這樣而來的。第一,這三行話可以適用于無論多少個數求最大值的情況,這是你的算法是否正確的一個必要條件,如果你的算法表達的長短依賴于具體數據的個數,那么你的算法不是通用的算法,不管是否能解決問題。第二,我們在表達中看到了“如果”,看到“重復”,很好,“如果”就是“分支流程”,就是<SPAN
lang=en-us>if</SPAN>或<SPAN lang=en-us>switch</SPAN>;而“重復”就是“循環流程”,是<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>循環從數組下標1開始,因為從算法的表述中,我們也看到了,N一開始就等于數組中的第一個數,而后和“下一個數”開始比較。</P>
<P>我們可以把代碼改良,以讓它方便于應用在任何個數的元素上。</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>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -