頁:
[1]
關於while的執行
我知道while的用法但是最近看一本書一直不了解他是怎麼跑的
我們一般while都是這樣用
while(迴圈條件)
{執行動作}
但我看到那本書它裡面用法是這樣
while(迴圈條件);
他竟然就這樣結束了
這樣這個迴圈不會搞自閉嗎?
他程式是這樣寫
left=0:right=10
void fun::Quicksort(int A[],int left,int right)
{
int i,j,s,temp;
if(left<right){
s = A[(left + right)/2];
i = left -1;
j = right +1; -------***
while(1)
{
while(A[++i] < s);
while(A[--j] > s); -------------***
if (i >= j)
break;
執行動作;
}
我想知道while(A[++i] < s);這句為否還回執行while(A[--j] > s);這句嗎?
他while(A[++i] < s);本身是只跑自己嗎?還是用來他為真跑while(A[--j] > s);的?
還有我標記***的地方,執行第一次的時候j=11到whlie(1)裡
所以while(A[--j] > s)第一次應該會是while(A > s)對吧!!
但是int A;索引直不是0~9嗎? 他這樣程式為什麼不會錯
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div> 照理講 應該符合條件就會往下執行
a[10]這個問題 應該主程式在call quick sort(A,left,right-1) function 的時候
應該會長這樣吧 不然滿不合理。找找主程式看看 本帖最後由 kilean 於 2016-9-26 11:47 PM 編輯
基本上是沒什麼太大的問題,是你觀念的問題。
條件不符合自然會離開回圈,只是缺乏力外處理。
雖然是sort當然要有sort的動作,這你沒看到,
或許是因為你斷章取義。
那就針對你的問題回答,
你所疑惑的while迴圈是否會執行,
答案是會的,
從sort的使用來講,
這個函式不是只有傳入left 及 right
還有一維陣列,由傳入值left=0及right=10判斷,
應該要傳入一維陣列,內容需要有11個整數。
假設是
int A[]={5,14,1,3,2,9,11,8,7,6,10};
第一個判斷當然是會先判斷傳入的參數是否正確
符合下列程式碼運作所需,
由left<right判斷,設計者索引值小的在左邊,
大的在右邊,與宣告的習慣同方向,
初步例外處理掉如果填入相同所引值或者將left比right大導致下列程式發生錯誤的問題。
s=A[(0+10)/2]
s=A
s=9
s的值主要用來判斷用
i與j都是定義初始的索引值
為何是-1 與 11呢?
因為設計者習慣用++i --j,與i++ j-- 不同,
依照你問的問題深度來講,
我必須回答你前者是先做運算,在判斷,後者是先判斷在運算。所以i與j的初始值不是定義0 與 10
while(A[++i] < 9);
i=-1,因此做完++運算後判斷 while(A < 9);
而A = 5
5小於9 條件為True,因此會繼續做
i=0,因此做完++運算後判斷 while(A < 9);
而A = 14
14不小於9條件為False,離開回圈
因此這個while迴圈是由左往右搜尋
但沒有例外處理,搜尋有可能超出範圍
至於while(A[--j] > s);
與上面同理,從右往左搜尋
也是沒有例外處理,搜尋有可能超出範圍
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div> 其實. C 對於if() while() 在() 中的東西因該叫做運算式, 不該叫作 迴圈條件
運算式的結果非0 為 true , 0 為false
至於什麼是運算式. 最簡單的說法. 就是 你寫的程式中的任何 記算式 都是運算式 當然也包含
a >=b
a == b
a <= b ... 這些比較運算式
本帖最後由 CoNsTaRwU 於 2016-9-30 06:59 AM 編輯
cockroachrun 發表於 2016-9-29 11:54 AM
其實. C 對於if() while() 在() 中的東西因該叫做運算式, 不該叫作 迴圈條件
運算式的結果非0 為 true , 0 ...
這位正解
補充一下,expression 的中文會翻成「表達式」
if ( expr )
stmt
在小括號中的任何表達式 expr 都會先被轉型為 int,轉型後不為 0 則執行任何敘述 stmt
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div> 你那行問的while 就是一直執行 條件不合時跳出
先看維基百科對quick sort的介紹
1. 從數列中挑出一個元素,稱為"基準"(pivot),
2. 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割結束之後,該基準就處於數列的中間位置。這個稱為分割(partition)操作。
3. 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序
再對照你的程式碼,其中s就是pivot,while(A[++i] < s);是要找出右半邊比s小的值,下一個while就是找出左半邊比s大的值,找到之後把他們交換就會符合上面所說的第二點。你書中的這種寫法其實不是很好,有點炫技的感覺。
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
頁:
[1]