freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

數(shù)據(jù)結(jié)構(gòu)與算法c(5)-文庫吧

2025-09-19 15:42 本頁面


【正文】 設(shè)初始記錄集為 20 30 10 45 25 22 55 50 則第一趟冒泡的過程為: 20 30 10 45 25 22 55 50 //20與 30比較 , 未交換 20 10 30 45 25 22 55 50 //30與 10比較 , 交換 20 10 30 45 25 22 55 50 //30與 45比較 , 未交換 20 10 30 25 45 22 55 50 //45與 25比較 , 交換 20 10 30 25 22 45 55 50 //45與 22比較 , 交換 20 10 30 25 22 45 55 50 //45與 55比較 , 未交換 20 10 30 25 22 45 50 55 //55與 50比較 , 交換 這樣 , 最大數(shù) 55被交換到了最后 。 接下來 , 進(jìn)行其他 (n2)趟冒泡 ( 只 寫出每趟的結(jié)果 ) : 10 20 25 22 30 45 50 55 //第 2趟 10 20 22 25 30 45 50 55 //第 3趟 10 20 22 25 30 45 50 55 //第 4趟 10 20 22 25 30 45 50 55 //第 5趟 10 20 22 25 30 45 50 55 //第 6趟 10 20 22 25 30 45 50 55 //第 7趟 10 20 22 25 30 45 50 55 //第 8趟 根據(jù)上面的討論 , 冒泡排序的算法的框架為 ( 設(shè)元素在 a[0]~a[n1]中 ) ; for (i=n1。 i0。 i) 對 a[0]—a[i]進(jìn)行冒泡 ; 進(jìn)一步地 , “ a[0]—a[i]進(jìn)行冒泡 ” 的實(shí)現(xiàn)為: for (j=0。 ji。 j++) if (a[j]a[j+1]) { t = a[j]。 a[j] = a[j+1]。 a[j+1] = t。 } 綜合起來 , 就得到完整的冒泡排序程序: long SortBubble(int a[], long n) {//將 a[0]~a[n1]中的數(shù)按升序排列 int t。 long i, j。 for (i=n1。i0。 i) for (j=0。 ji。 j++) if (a[j]a[j+1]) { t = a[j]。 a[j] = a[j+1]。 a[j+1] = t。 } return 0。 } 該算法主要由兩個(gè)嵌套的循環(huán)構(gòu)成 , 顯然是 n2數(shù)量級的 。 167。 冒泡算法的改進(jìn) 我們分析一下前面的冒泡排序算法,發(fā)現(xiàn)其每次冒泡, 都機(jī)械地 從起點(diǎn)比較到當(dāng)前終點(diǎn)。事實(shí)上,若在某一次冒泡中,從某個(gè)位置起,后面都未進(jìn)行過交換,則表明該位置后面的各元素已排好序。 例如 , 設(shè)某趟冒泡后 , 記錄序列為: 序號: 0 1 2 3 4 5 6 記錄: 20 10 19 18 30 40 50 下趟冒泡時(shí) , 當(dāng)交換完 20與 18后 ( 序號 2與 3) ,其后就沒有再發(fā)生交換 。 這表明 , 序號 3以后的元素 , 已經(jīng)排好序 , 因此 , 下趟冒泡的終點(diǎn)到 2號位置就可以了 。 這樣 , 就可以減少冒泡的趟數(shù) 。 據(jù)此 ,我們可以通過控制冒泡次數(shù)改進(jìn)前面的冒泡算法 。具體做法是 , 將每次冒泡的終點(diǎn)由固定改為可調(diào) 。在冒泡比較中 , 每交換一對元素 , 就將這對元素的第一個(gè)的序號 ( 設(shè)為 k) 記下 , 當(dāng)一趟冒泡后 , k就是該趟中最后一次的交換位置 , 下趟比較的終點(diǎn)就可以設(shè)置為 k。 這樣處理后 , 顯然 , 若在一次冒泡中未交換任何記錄 , 或 k已退為 0, 則算法終止 。 long SortBubble2(int a[], long n) {//將 a[0]~a[n1]中的數(shù)按升序排列 long k, j, kk。 int t。 k=n1。//用 k記錄上一趟的交換位置 while (k0) {kk=0。 for (j=0。 jk。 j++) if (a[j]a[j+1]) {t = a[j]。 a[j] = a[j+1]。 a[j+1] = t。 kk = j。 //記錄比較的位置 。 為避免在循環(huán)中改變循環(huán)終值 , 不直接使 用 k } k=kk。 }//while return 0。 } 顯然,該該算法對已接近排好序的數(shù)據(jù)集,速度較快。特別地,若數(shù)據(jù)集已排好序,則該算法只需掃描一次數(shù)據(jù)集。不過,雖然有了較大改進(jìn),但時(shí)間復(fù)雜度仍然為 O(n2). 167。 快速排序 * (一 ) 基本思想 快速排序( Quick Sort)是交換排序的另一種,實(shí)際上它是冒泡排序的另一種改進(jìn)??焖倥判虻幕舅枷胧牵涸诖判虻?n個(gè)記錄中任取一個(gè)記錄(例如就取第一個(gè)記錄),以該記錄的鍵值為標(biāo)準(zhǔn)(稱為基準(zhǔn)值),將所有記錄分為三組,使得第一組中各記錄的鍵值均小于或等于基準(zhǔn)值,第二組只含基準(zhǔn)值對應(yīng)的一條記錄,第三組中各記錄的鍵值均大于基準(zhǔn)值。這個(gè)過程稱為一趟分割。一趟分割后,基準(zhǔn)值的位置就是該值的最終位置(符合排序序列要求的位置)。然后,對所分成的第一和第三組再分別重復(fù)上述方法,直到所有記錄都排在適當(dāng)位置為止。 (二 ) 分割算法 實(shí)現(xiàn)一趟分割的算法稱為分割算法 。 我們在第 2章中已介紹過分割算法 , 給出了其實(shí)現(xiàn)函數(shù) long Partition (long a[], long p1, long p2) 其功能是對 a[p1]~a[p2]進(jìn)行分割,返回分割點(diǎn)的序號。 (三 ) 快速排序遞歸程序 快速排序的遞歸實(shí)現(xiàn)是直接的,具體程序如下。 long SortQuick(ing a[], long p1, long p2) {// 對 a[p1]~a[p2]中元素排序 long p。 if (p1p2) { p = Partition(a, p1,p2)。 SortQuick(a, p1, p1)。 SortQuick(a, p+1, p2)。 return p2p1+1。 } return 0。 } 為了寫出非遞歸算法 , 我們先分析一下快速排序的過程 。 每次分割后 , 得到三部分 , 分割點(diǎn) ( 第二部分 ) 對應(yīng)的位置上的元素已排好 , 不需要再調(diào)整 , 但其他兩部分需要繼續(xù)分割 。 由于每次只能分割一部分 , 所以就需要將另一待分割的部分的界限保存起來 , 當(dāng)當(dāng)前分割的部分被分割完后 , 再分割這部分 。注意 , 由于當(dāng)前分割的部分也比較大 , 所以也需要多次分割 ,這樣 , 就需要不斷地分割 , 不斷地保存 ( 另一待分割部分 ) 。那么 , 待分割部分 ( 的界限 ) 如何保存呢 ? 為簡單 , 可以保存在一個(gè)棧中 。 具體程序如下 。 long SortQuick2(int a[], long p1, long p2) {//對 a[p1]~a[p2]中元素排序 long *s, top。 long p,i, j。 s=new long[2*(p2p1+1)]。 //申請??臻g。實(shí)際申請量可以 是 log2(2*(p2p1+1))。 if (s==NULL) return 1。 top=0。 top++。 s[top]=p1。 //待排序元素的起點(diǎn)與終點(diǎn)進(jìn)棧 top++。 s[top]=p2。 while (top!=0) {//每次從棧中取一對范圍值 [i,j],對序號為該范圍 內(nèi)的元素進(jìn)行新的一個(gè)回合的分割 j = s[top]。top。 i = s[top]。 top。 while (ij) {//連續(xù)分割序號在 [i,j]內(nèi)的元素。每次都是將 [i,j]一分為三,前后兩部分中較大者進(jìn)棧待分割, //較小部分繼續(xù)在下次循環(huán)中分割,而分割點(diǎn)的位置已排好,不需再調(diào)整。 p = Partition(a, i, j)。 //分割 a[i]~a[j], 返回分 割點(diǎn)到 p中。至此, a[p]位置已排好 if (pijp) {//前部較小,后部進(jìn)棧 ,下次先分割前部 if (j p+1) //如果待進(jìn)棧的部分元素個(gè)數(shù)不足 2,則不進(jìn)棧 {top++。 s[top] = p+1。 top++。 s[top] = j。 } j = p1。 } else {//后部較小,前部進(jìn)棧,下次先分割后部 if (p1i) //如果待進(jìn)棧的部分元素個(gè)數(shù)不足 2, 則不進(jìn)棧 {top++。 s[top] = i。 top++。 s[top] = p1。 } i = p+1。 } }// while (ij)}// while (top!=0) return p2p1+1。 } 下面給出利用上面的非遞歸快速排序程序進(jìn)行排序的過程。假定分割的基準(zhǔn)元素是區(qū)間中的第一個(gè)元素。方括號表示無序區(qū)。 初始關(guān)鍵字 [70 73 69 23 93 18 11 68] 第 1趟分割后 [68 11 69 23 18] 70 [93 73] 第 2趟分割后 [68 11 69 23 18] 70 73 93 第 3趟分割后 [18 11 23] 68 69 70 73 93 第 4趟分割后 11 18 23 68 69 70 73 93 快速排序是不穩(wěn)定的,請讀者自己舉出一例說明。 可以證明,快速排序平均比較次數(shù)是 O( nlog2n)??焖倥判虻挠涗浺苿哟螖?shù)小于或等于比較次數(shù),因此快速排序總執(zhí)行時(shí)間為 O( nlog2n) . 從平均時(shí)間性能而言,快速排序最佳。但在最壞情況下,即對幾乎是排序好的輸入序列,該算法的效率很低,近似于 O( n2)。對于原始次序越亂的數(shù)據(jù),該算法越有效。另外,該算法對于較大的數(shù)據(jù)集效果明顯。 關(guān)于輔助存儲的使用,這里使用了一個(gè)棧,這個(gè)棧的大小取決于分割調(diào)用的深度,最多不會超過 n。這里, n為待排序的數(shù)據(jù)元素個(gè)數(shù)。如果每次
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1