演算法學習(一) 排序演算法

2021-08-29 02:43:04 字數 3352 閱讀 9706

參考:排序

氣泡排序是一種很簡單也很常見的排序演算法,我們在初學程式語言,尤其是初學陣列的時候,應該都了解過氣泡排序,下面就當複習吧。

public

static

void

pubblesprt

(int array,

int left,

int right)}}

}

氣泡排序:從陣列下標left開始,依次比較相鄰兩個元素的值,如果前面的數大於後面的數,則互換這兩個數,每輪比較之後left+1,直到left=right為止。

時間複雜度:$ o(n^2) $,空間複雜度: $o(n) $。

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

public

static

void

selectsort

(int array,

int left,

int right)}if

(minindex != i)

}}

時間複雜度:$ o(n^2) $,空間複雜度: $o(n) $。

插入排序(insertion sort)的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用inplace排序(即只需用到o(1)的額外空間的排序),因而在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

public

static

void

insertsort

(int array,

int left,

int right)

//也可以改寫成下面這種形式

/* while (j>=left)

*/array[j +1]

= temp;

}}

時間複雜度:$ o(n^2) $,空間複雜度: $o(n) $。

上面寫了三個排序以後,終於到了快排了。快排怎麼說呢,是我認為高階排序演算法裡面我能夠理解的一類簡單演算法了。

快排的基本思想其實也很簡單,大概就是分治法(分治是啥我也不太懂)。

基本思想:從序列中選出乙個關鍵字,然後根據關鍵字將序列分成兩部分(比關鍵字大、比關鍵字小),然後將左右兩側的序列分別按照剛才的方法對其進行排序,直到序列不可再分為止。

public

static

void

quicksort

(int array,

int left,

int right)

array[i]

= array[j]

;while

(i < j && array[i]

<= temp)

array[j]

= array[i];}

array[i]

= temp;

quicksort

(array, left, i -1)

;//遞迴左邊

quicksort

(array, i +

1, right)

;//遞迴右邊

}

時間複雜度:$ o(nlog(n)) $,空間複雜度: $o(n) $。

這裡可以看到,快速排序的時間複雜度要比前三種排序方法低了很多。

歸併排序是一種穩定的演算法,採用分治的思想,有序的子串行合併得到有序序列。

實現步驟:

1、將序列分成長度為 n/2的兩部分

2、對於左右兩部分採用分治的方法得到有序序列

3、將左右兩個有序序列合併得到整個有序序列

public

static

void

splitarray

(int array,

int left,

int right)

public

static

void

mergearray

(int array,

int left,

int mid,

int right)

else

}while

(i<=mid)

while

(j<=right)

//將新陣列覆蓋掉舊陣列

index=0;

while

(left<=right)

}

ps:不簡單啊,歸併演算法看了好久好久然後才寫出來,一直想找乙個不用新建陣列的方法,但是最後還是沒有找到,用陣列也搞了很久,不過還好,認識到了歸併怎麼用了

時間複雜度:$ o(nlog(n)) $,空間複雜度: $o(n) $。

二分(折半)插入(binary insert sort)排序是一種在直接插入排序演算法上進行小改動的排序演算法。其與直接排序演算法最大的區別在於查詢插入位置時使用的是二分查詢的方式,在速度上有一定提公升。

public

static

void

binaryinsertsort

(int array,

int left,

int right)

else

}int temp=array[i]

;for

(int j=i;j>high+

1;j--

) array[high+1]

=temp;

}}

時間複雜度:$ o(n^2) $,空間複雜度: $o(n) $。

雞尾酒排序等於是氣泡排序的輕微變形。不同的地方在於從低到高然後從高到低,而氣泡排序則僅從低到高去比較序列裡的每個元素。他可以得到比氣泡排序稍微好一點的效能,原因是氣泡排序只從乙個方向進行比對(由低到高),每次迴圈只移動乙個專案。

public

static

void

cocktailsort

(int array,

int left,

int right)

} high--

;for

(int i=high;i>low;i--)}

low++;}

}

時間複雜度:小於 o(n

2)

o(n^2)

o(n2

) 且大於 o(n

)o(n)

o(n)

。佔位,目前還沒有理解,等大佬給我講

演算法(一)排序

一 o n 2 的排序演算法 1.選擇排序 selection sort 先找到最小的 public static void selectsort int arr 2.氣泡排序 bubble sort 先找到最大的 public static void bubblesort int arr 3.插入...

經典演算法學習(一)排序之氣泡排序

演算法即內功 1.排序是什麼 排序簡單來說就是以公升序或者是降序來排列資料的演算法。2.為什麼要排序 排序是電腦科學中非常重要的的一類演算法,排序可以顯著地降低問題的複雜性。比如查詢。3.排序的分類 氣泡排序是最簡單的一種排序演算法。它從輸入陣列的第乙個元素開始迭代到最後乙個元素。比較相鄰的兩個元素...

演算法(一) 排序sorting

問題 輸入數字a1,a2,a3.an,使其公升序輸出。1 插入排序 insertion sort 演算法 這個演算法從陣列的第二個元素開始迴圈,將選中的元素與之前的元素一一比較,如果選中的元素小於之前的元素,則將之前的元素後移,最後再將選中的元素放在合適的位置。在這個演算法執行的過程中,總是保持著索...