排序演算法學習總結

2021-10-07 11:54:36 字數 3999 閱讀 5705

一.氣泡排序

簡單來說就是兩兩比較,把大的數換到後面,小的數換到前面,一輪比較後,最大的數就排到了最後面,

總共要比較n-1輪,氣泡排序是一種穩定排序演算法,即使兩個數相等,也不會破壞它們原有位置。

二.快速排序

簡單來說就是選定乙個基準值,一般選取最後乙個數為基準值,然後定義兩個引數start,end,

start從第一位開始掃瞄,end從最後一位開始掃瞄(包括基準值),如果start找到比基準值大的數,end找到比基準值小的數,就把兩個位置交換一下,直到start與end相等,把start位置上的數與基準值相交換,這樣左邊的數都比基準值小,右邊的數都比基準值大,然後遞迴(0,start-1),(start+1,end)。

三.選擇排序

從第一位開始掃瞄一輪陣列,找到最小值的位置,把最小值和第一位位置互換,然後從第二位開始掃瞄一輪陣列,同樣找到最小值,然後和第二位互換…可以看出這是乙個遞迴,遞迴終止條件就是當掃瞄開始的位置start等於end。

四.插入排序

簡單來說就是把第一位看成已經排好的有序陣列,從第二位開始,每一次都把即將進入有序陣列的數和前面的有序陣列進行比較,找到insert place,比如(data,start,end),data表示要排序的陣列,在這個陣列裡面,data[0]到data[start-1]都是排好的,data[start]到data[end]都是未排好順序的。那麼insert place就屬於0到start,找到後,把data[start]插入insert place 處,後面的數依次向後移動乙個位置。熟悉遞迴的應該也能看出這個也可以用遞迴實現,遞迴終止條件就是start>end。

五.歸併排序

歸併排序就是講求乙個先「」分「,後「合」,每次都把陣列分成兩部分,一次次分下去直到,各個部分只有乙個元素,再兩兩合併排序,所以「分」的思想就是divide(data,first,last)---->merge(data,first,mid),merge(data,mid+1,last).「合」的思想combine(int data,int first,int mid,int last)

分別掃瞄左半部分和右半部分:first->mid mid+1->last,兩兩比較,把小的數放到乙個新的陣列中去。中間必然會出現兩部分之間會有一部分正好分配完畢(也就是沒有元素了),那麼這時候就把剩下部分整個打包貼上到新陣列後面。

六.全排列

總的來說非常簡單的乙個思路,(char* str,int first ,int last),first也就是第乙個元素,last也就是最後乙個元素,然後舉個例子123,首先確定第乙個位置的元素就是1,2,3這三種可能,怎麼實現的呢?就是把第乙個字母依次和第一,第二,第三個元素換一下位置,你肯定會疑問為什麼要和自己互換呢?這不是多此一舉嗎?其實關鍵在於下一步的遞迴,我們傳進去的是(str,first+1,last),所以如果沒有那個和自己互換的話,那麼23子串永遠也不可能會進入遞迴,記得遞迴完,要恢復原狀.然後遞迴終止條件就是當first==last,那麼就可以直接輸出str啦。

七.**

#include

#include

#include

void

quicksort

(int data,

int start,

int end)

;//快排

void

choosesort

(int data,

int start,

int end)

;//選擇排序

void

insertsort

(int data,

int start,

int end)

;//插入排序

void

merge

(int data,

int first,

int mid,

int last)

;void

mergesort

(int data,

unsigned

int first,

unsigned last)

;//歸併排序

void

allarrange

(char

* str,

int,

int)

;void

swap

(int

&a,int

&b)//交換兩個數

intmain()

;mergesort

(nums,0,

9);//測試各個排序演算法,直接改名字就夠了

for(

int i =

0; i <10;

++i)

printf

("%d "

, nums[i]);

/*char str = "abcd";

allarrange(str,0,3);*/

return0;

}void

quicksort

(int data,

int start,

int end)

int pivor = end;

while

(startwhile

(data[end]

>= data[pivor]

&& start < end)

if(start < end)

}swap

(data[start]

, data[pivor]);

quicksort

(data,

0, start -1)

;//遞迴左半部分

quicksort

(data, start +

1, pivor)

;//遞迴右半部分

}void

choosesort

(int data,

int start,

int end)

swap

(data[start]

, data[min_index]);

choosesort

(data, start +

1, end)

;//把排好的數除外,繼續遞迴排序

}void

insertsort

(int data,

int start,

int end)

//start和end表示無序序列,0->start-1表示有序}if

(insertplace != start)

//有位置可以放入,先把前面的都向後移動一格,空出位置放進去

data[insertplace]

= index;

}++start;

//必須要有,不然下面遞迴會出錯

insertsort

(data, start, end);}

void

merge

(int data,

int first,

int mid,

int last)

else

tmp[i]

= data[right_low++];

}if(left_low <= left_high)

if(right_low <= right_high)

for(k =

0; k <= last-first;

++k)

data[first+k]

= tmp[k]

;free

(tmp)

;//釋放記憶體,要注意

return;}

void

mergesort

(int data,

unsigned

int first,

unsigned last)

void

allarrange

(char

* str,

int first,

int last)

else

}return

;}

演算法學習(五) 基本排序演算法總結

前幾天學習幾個基本的排序演算法,下面來總結一下 在維基百科上有排序演算法的一張圖,紅線是我之前總結學習的。從我們學習的排序演算法中可以分為兩類 簡單排序有冒泡 選擇 插入排序 改進演算法有希爾 堆排序 歸併排序和快速排序。快速排序是冒泡的公升級版,屬於交換排序 希爾排序是直接插入排序的公升級,屬於插...

演算法學習總結 五 快速排序

一 演算法簡介 快速排序 quicksort 是對氣泡排序的一種改進。它的基本思想是 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。二 演算法描述...

排序演算法學習

一直都想把排序和搜尋類的演算法總結一下,一直拖著沒寫,主要是太懶了,現在決定還是要再好好學習下這些基本的演算法。畢竟基礎真的是很重要。好了現在開始學習第乙個排序演算法 插入排序 我記得插入排序在我們以前的資料結構教程上是第乙個介紹的 插入排序 聽這個排序名字就是將乙個什麼數要插入到某個地方,不錯,他...