0 1排序引理

2021-07-04 07:53:59 字數 1224 閱讀 7717

《演算法導論(第3版)》第8章 思考題8-7:

針對兩個陣列元素a[i]和a[j] (ia, i, j)

ifa[i] > a[j]

exchange a[i] with a[j]經過比較交換操作之後,我們得到a[i]≤a[j]。

遺忘比較交換演算法是指演算法只按照事先定義好的操作執行,即需要比較的位置下標必須事先確定好。雖然演算法可能依靠待排序元素的值,也不能依賴任何之前的比較交換操作的結果。例如,下面是乙個基於遺忘比較交換演算法的插入排序:

insertion-sort(a)

forj = 2 to a.

length

fori = j-1 downto 1

compare-exchange(a, i, i+1)

0-1排序引理提供了有力的方法來證明乙個遺忘比較演算法可以產生正確的排序結果。該引理表明,如果乙個遺忘比較交換演算法能夠對所有只包含0和1的輸入序列排序,那麼它也可以對包含任意值的輸入排序序列排序。

根據書上的提示,作出以下證明:

假設遺忘比較交換演算法x能對所有0-1序列排序,但不能對陣列a[1..n]正確排序。設a[p]是沒放到正確位置的最小元素,a[q]放到了a[p]的正確位置上,a[q]>a[p]。若a[q]定義只包含0和1的陣列b[1..n]:若a[i]≤a[p]則b[i]=0,反之,b[i]=1。b[p]=0,b[q]=1。

下標為p的元素與下標為1, p2, …, pm>的元素經歷一系列遺忘比較交換。例項a中,a[p]最後放到了不正確的位置。對於b[r] (r≠p),若b[rx]=b[r],則b[rx]和b[r]不交換,即使a[rx]和a[r]進行了交換;但正是由於b[rx]=b[r],效果一樣。特別地,b[p]與b[px]交換當且僅當a[p]與a[px]交換。總體而言,演算法的輸出和a一致。比如:

輸入:5 3 2 4 7

輸出:2 5 3 7 4

那麼 輸入:1 0 0 1 1

輸出:0 1 0 1 1

也許4和5交換了,但在0-1序列中它們都是1,換不換無所謂。關鍵在於1比0(=b[p])大。

因此,本來該放b[p] (=0)的位置,放上了b[q] (=1),演算法x不能對所有0-1序列產生正確的輸出。這跟假設矛盾,所以不存在這樣的陣列a[1..n]。即:如果乙個遺忘比較交換演算法能夠對所有只包含0和1的輸入序列排序,那麼它也可以對包含任意值的輸入排序序列排序。

01 排序 選擇排序

基本原理 對於給定的一組資料,經過第一輪比較後得到最小的資料,然後將該資料與第乙個資料的位置進行交換 然後對不包括第乙個資料以外的其它資料進行第二輪比較,得到最小的資料並與第二個資料進行位置交換 重複該過程,直到進行比較的資料只有乙個時為止。舉例 待排序陣列 38,65,97,76,13,27,49...

演算法01 排序演算法小結

排序演算法是一模擬較基礎的演算法,也是在學習程式設計與演算法的過程中必須學習的一類問題。初學者經常在排序時摸不著頭腦,面對一眾的排序,不知從何處下手。下面筆者將以筆記的形式分享一下我在學習演算法時整理的一些排序演算法。假設現有亂序陣列 5,2,7,4,6,1,8,我們將其排序為公升序陣列,各種方法過...

演算法01 排序演算法小結

排序演算法是一模擬較基礎的演算法,也是在學習程式設計與演算法的過程中必須學習的一類問題。初學者經常在排序時摸不著頭腦,面對一眾的排序,不知從何處下手。下面筆者將以筆記的形式分享一下我在學習演算法時整理的一些排序演算法。假設現有亂序陣列 5,2,7,4,6,1,8,我們將其排序為公升序陣列,各種方法過...