看了《演算法第四版》後,想要熟練下自己對排序演算法的理解,就選擇用快速排序來練手,並運用了《演算法第四版》提供的api,以實現排序演算法的視覺化。
在眾多排序演算法中,快速排序是其中有很高效率的一種,同時也是較為複雜的排序演算法。
快速排序是一種分治的排序演算法。其思想是將一段無序的資料進行切分後,在分別對切分後的兩段資料進行排序,對這兩段資料都進行再一次的切分後分別排序,不斷迴圈至完全排序完成,這個過程可通過遞迴實現。
先實現較為基礎的函式方法(比較大小,交換資料,是否排序成功):
/*比較大小*/
public boolean less(comparable x,comparable y)
/*資料交換*/
public void change(comparable a,int i,int j)
/*判斷是否完成排序*/
public boolean issort(comparable a)
change(a,hi,i);//i位置的值比較大,temp值是在最後,故將i位置的值交換至最後位置
return i;
}
切分( partition)方法有幾個需要注意的點,都在注釋中提醒了,由於快速排序的主要缺點是非常脆弱,在實現時要非常小心才能避免低劣的效能。
1.
在從左往右遍歷資料是,當大於或等於臨時資料時都要將其進行位置交換操作,因為這樣可以避免演算法的執行時間變為平方級別(在含有大量重複值時,切分效率及其低效。ps:《演算法第四版》練習2.3.11),從右往左遍歷同理。
while(less(a[++i],temp))2.在遍歷的過程中,要注意終止條件,如用判斷語句:
if(i==hi)判斷是否越界,防止訪問到該資料段以外的資料,導致排序出錯。
3.
判斷左右遍歷是否已經有交匯處以終止迴圈,使用判斷語句:
f(i>=j)至此,排序演算法的核心**已經分析完畢。
public void sort(comparable a)
public void sort(comparable a,int lo,int hi)
排序(sort)**運用了遞迴的思想以實現不斷地切分,並通過切分(partition)函式返回的值傳遞給下一次排序函式。由於快速排序存在乙個潛在的缺點:在切分不平衡時可能會非常低效。例如,如果第一次從最小元素切分,第二次從第二小元素切分,如此這般,每次呼叫只會移除乙個元素,這會導致乙個大陣列需要切分很多次。因此需要在排序前將資料打亂以防止這種可能性。
stdrandom.shuffle(a);
(改**使用了《演算法第四版》提供的api)
為了將排序的過程視覺化,使用了《演算法第四版》api寫出將資料轉化為條形統計圖的方法。(思路:乙個將畫板指定條形資料清空的方法(towhite)和乙個將指定條形資料重新畫在畫板上的方法(toblack))
public static void towhite(comparable a,int i,int j) catch (interruptedexception e)
}public static void toblack(comparable a,int i,int j) catch (interruptedexception e)
}
由於需要在排序過程中一邊改變條形圖,故需要在快速排序**中進行繪圖**的插入,主要是在切分函式進行修改:
public int partition(comparable a,int lo, int hi)
draw.towhite(a, i, hi);/*資料交換前清除對於的條形資料*/
change(a,hi,i);
draw.toblack(a, i, hi);/*畫上交換後的條形資料*/
return i;
}
public class random {
private comparable num;
public comparable output(int n){
num = new comparable[n];
for(int i=0;i至此,所有**已經變現完成,執行main函式檢視其效果。
ps:不知是否繪畫函式插入在切分函式位置有所不妥,在某些情況下繪畫的排序過程會出現一兩個錯誤的條形資料,但排序後的資料是沒有錯誤的!(故可以排除排序演算法錯誤)只是繪畫過程有錯誤,希望有能夠有網友有指出其原因,萬分感謝。(錯誤情況如下)
資料視覺化 什麼是資料視覺化
資料對應的英文單詞是data,從資訊獲取的角度看,資料是對目標觀察和記錄的結果,是現實世界中的時間 地點 事件 其他物件或概念的描述。不同學者對資料的作用也給出不同的定義,大致分為以下3類 視覺化對應的兩個英文單詞 visualize和visualization。visualize是動詞,描述 生成...
視覺化歸併排序演算法
今天又有一點空,寫了歸併排序,並用swing動畫顯示了排序過程。排序過程不難,可以看這裡下面主要說說視覺化的。像諸如氣泡排序的話,如果想對排序過程做視覺化。那麼只要簡單的在每個繪圖主迴圈中重繪整個資料就行了。但是,歸併排序不一樣,因為它的排序過程是不停建立一些中間小陣列來儲存,然後不停合併這些陣列,...
演算法視覺化 歸併排序
時隔幾個月,終於重新拾起了c 老司機回歸,自然是 啟動vs 新建解決方案 新增新專案 一鍵三連。啊,這絲滑的感覺,莫不是?不能打斷了這絲滑的感覺,隨便寫點什麼,寫個歸併排序吧!一頓操作猛如虎,一看編譯。祝大家虎虎生威!此時的我 懷念起了用matlab做數字訊號處理的日子。自信心備受打擊,卑微的我找到...