這個是緊接著的下一道題.發現了,其實,隨著資料種類多起來,分塊也就多了,這也正是快速排序的來曆吧.還有呢,就是,隨著資料多起來,也就是會重複的情況下,也就會出現array[i] == array[j] == array[pivot]的時候,那樣我這段代碼的主迴圈也就無法運行了.於是,在median3 () 函數中先要將兩頭排好序, 以便在主迴圈中安全地使用首碼自增運算子.
這本書裡的練習題感覺不錯,只是演算法分析的題做著比較吃力,相信隨著數學的學習,情況會好起來吧!
貼上代碼,呵呵.
/*7-32-11-26-23.19.c -- 第七章第三十二題*/<br />#include <stdio.h></p><p>#define SIZE 22<br />#define FALSE 1<br />#define MAYBE 2<br />#define TRUE 3<br />#define PROBABLYFALSE 4<br />#define PROBABLYTRUE 5</p><p>int main (void) ;<br />void print_array (const int * const array, const int size) ;<br />void swap (int * const vala, int * const valb) ;</p><p>int main (void)<br />{<br />int array[SIZE] = {TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, MAYBE, MAYBE, MAYBE, MAYBE, FALSE, FALSE, FALSE, FALSE, FALSE, MAYBE, MAYBE, MAYBE, FALSE} ;<br />int i, j, size, index, probablyfalse, probablytrue ;</p><p>probablyfalse = PROBABLYFALSE ;<br />probablytrue = PROBABLYTRUE ;<br />size = SIZE ;<br />index = (size - 1) / 2 ;<br />i = 0 ;<br />j = size - 1 ;</p><p>print_array (array, size) ;<br />/*First step*/<br />swap (array + index, &probablytrue) ;<br />while (1)<br />{<br />while (FALSE == array[i] || MAYBE == array[i])<br />i++ ;<br />while (TRUE == array[j])<br />j-- ;<br />if (i < j)<br />swap (array + i, array + j) ;<br />else<br />break ;<br />}<br />swap (array + i, &probablytrue) ;<br />/*Second step*/<br />if (TRUE == array[i])<br />i -= 1 ;<br />index = i / 2 ;<br />j = i ;<br />i = 0 ;<br />swap (array + index, &probablyfalse) ;<br />while (1)<br />{<br />while (FALSE == array[i])<br />i++ ;<br />while (MAYBE == array[j])<br />j-- ;<br />if (i < j)<br />swap (array + i, array + j) ;<br />else<br />break ;<br />}<br />swap (array + i, &probablyfalse) ;</p><p>print_array (array, size) ;</p><p>return 0 ;<br />}</p><p>void print_array (const int * const array, const int size)<br />{<br />int i ;</p><p>for (i = 0; i < size; i++)<br />printf ("%s/n", FALSE == array[i] ? "FALSE" : (MAYBE == array[i] ? "MAYBE" : "TRUE")) ;<br />putchar ('/n') ;<br />}</p><p>void swap (int * const vala, int * const valb)<br />{<br />int temp ;</p><p>temp = *vala ;<br />*vala = *valb ;<br />*valb = temp ;<br />}