首先我一定要提醒大家一件事情:謝爾排序法最一開始是用來改良「插入排序法」的,所以裡面的觀念不是SWAP,而是「插入」。會這樣寫一個前提的原因,是因為我在上課的時候,某個老師將「插入」這個動作誤植為「交換」,所以讓很多人一頭霧水。說真的,不是我偏,但身為一個補習班老師,你就不能講得正確一點嗎!?Doth thou monther know you were such idot? (#註1)
謝爾貝殼排序法要先找到級距(gap),最簡單的級距就是把陣列大小/2。相同級距的值作為一個位元組進行插入排序,結束之後級距/2進入迴圈,直到級距等於1 為止。
#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
#define SWAP(a,b){ int temp =a;a=b;b=temp;}
archerdevil 發表在 痞客邦 留言(0) 人氣(1,240)
簡單說就是第一次找到最小的放到第一個元素位置,第二次找到第二小的放到第二個元素位置......
BIG OH大約是.... n+n-1+n-2+...+2 = ((n-2+1)n)/2 = ((n-1)n)/2
因此約等於O(n2)
archerdevil 發表在 痞客邦 留言(0) 人氣(209)
好,細部分解完快速排序之後,讓我們依照由左到右、由小到大的順序,再玩一次快速排序。
這一次,我們要用最簡短的方式試看看
archerdevil 發表在 痞客邦 留言(1) 人氣(133)
進入快序排序法之後,其實就很考驗邏輯思考,所以其實我很少用快速排序或者是合併排序法。理由很簡單,寫起來很麻煩很囉唆,一不小心就會錯很大。
不過該寫還是要寫,該複習還是要複習,所以今天來玩所謂的不穩定排序法:快速排序。
快速排序的動作如下
1. 決定一個基準點(中間、左邊、或者右邊)
archerdevil 發表在 痞客邦 留言(0) 人氣(371)
總覺得今天狀況不是很好,腦子不是很清楚,一個選擇排序寫好久,自以為邏輯對,結果把自己繞到迷宮理去了XDD
所謂的選擇排序,就是當你要由小到大排序的時候,先找到最小的紀錄起來,然後與第一個位置交換。
比如說當你今天有意個array{5,4,3,2,1},你打算由小到大重新排列
那第一輪過後一定是{1,4,3,2,5}
archerdevil 發表在 痞客邦 留言(0) 人氣(4,833)
泡泡排序玩過之後,為什麼會有本篇「之二」誕生?
很簡單,因為這一次要玩的,是降低運算次數。為什麼要降低運算次數?
很簡單,假設我們有一個陣列大小為三的陣列arr[3]={A, B, C}
如果不降低次數的話,使用兩個迴圈,總次數為:(n-1)(n-1) = 2*2 = 4次 //不要忘記統統從零開始
archerdevil 發表在 痞客邦 留言(0) 人氣(685)
雖然很簡單但還是要複習一下的基礎排序法之一:泡泡排序法
這大概是所有學寫程式的人一定會遇到的問題。這個問題練習了兩個主題,一個是基礎排序,另外一個是兩值交換。兩值交換有好幾種方法,一種是多增加一個變數,用三個空間做兩個值的互換,另外一種是只能用在數字上:B=A+B, A=B-A, B=B-A。這種方法可以在不增加變數空間佔用的狀況下實現兩個數值的交換>
範例:
int A = 9;
archerdevil 發表在 痞客邦 留言(0) 人氣(3,807)
昨天寫了陣列與一般堆疊,講到堆疊當然會想到佇列,所以今天來玩一般佇列。
一般佇列當然是先進先出,也就是說從嘴巴吃進去從屁股拉出來,所以會有top當作屁股、rear當作嘴巴,放置item一定都從嘴巴,刪除一定都從屁股。
需要寫到的當然會有create功能(用來初始化佇列),isempty、isfull(用來判斷是否空佇列、是否有空間可以放入),add功能(放入)、以及del(刪除)功能。其實一般佇列應該還要寫一個釋放空間功能,因為佇列的存入一定是從rear,一般佇列並不像是環狀佇列一樣頭尾銜接,所以如果沒有釋放空間功能的話,當rear的位置在陣列的最尾端時,不管陣列中有沒有空間都是無法繼續放入元素的。
archerdevil 發表在 痞客邦 留言(1) 人氣(115)
上一次用鍊結串列做過,不過說到堆疊,C語言最好還是用一般陣列寫
有鑑於此,所以這次我用陣列玩看看。
首先,要說明一下。堆疊的建構有幾個一定要出現的,比如說create功能(初始化堆疊)、push功能(置入)、pop功能(取出/刪除)、以及很重要的IsEmpty(判斷是否為空堆疊,沒有這個pop會出錯);除了這四個以外,如果用陣列來做,就一定要考慮到陣列空間是否已滿。如果用鍊結串列來做,因為空間是「需要才加上去」,空間配置是可動的,所以IsFull這個功能可以不要沒關係,但如果是陣列,沒有這個功能,恐怕就會有溢出問題。
archerdevil 發表在 痞客邦 留言(0) 人氣(1,304)
不管是系統分析、資訊管理、還是程式語言,統統都會講到OO(物件導向,Object Oriented)概念,而且被提及得非常頻繁。究竟什麼是物件導向?這大概可以分成兩個層面來說:OOA(物件導向分析)、以及OOD(物件導向設計)。
所謂的OOA,是把整個需求拆解成幾個甚至於許多個細部需求,這些細部需求組合起來必然為委案者的原始需求,然後根據這些被簡化了的細部需求瞭解各種功能物件,從而在分析階段清楚的辨明整個需求的面貌。
OOD則是建立在OOA前提之上;根據物件導向分析結果,分別同步或依序設計、撰寫、測試、組裝所有的功能元件,以一種類似於模組化設計生產的方式,將需求實質化。
archerdevil 發表在 痞客邦 留言(0) 人氣(154)