6種排序演算法

2021-10-01 01:47:14 字數 3820 閱讀 9165

氣泡排序

選擇排序

歸併排序

快速排序

堆排序插入排序,顧名思義肯定是已插入為主,將待排序的陣列分為已排序(陣列前部分)和未排序(陣列後部分),這裡我們已從小到大排序,陣列為num[0–end]剛開始排序時,固定第乙個數num[0]為已經排序好的數,從第二個數num[1]開始,從後往前比較已排序中的資料,如果小於num[1] 演算法復

雜度o(

n2

)演算法複雜度o(n^2)

演算法複雜度o

(n2)

/**

* 插入排序

* @param nums

*/private

static

void

insertsort

(int

nums)}}

}

氣泡排序,兩兩交換位置,演算法復

雜度o(

n2

)演算法複雜度o(n^2)

演算法複雜度o

(n2)

/**

* 氣泡排序

* @param nums

*/private

static

void

maopao

(int

nums)}}

}

每輪迴圈選擇乙個最小值,將這個值與第乙個位置交換,以此類推,一共n-1輪

算 法復

雜度o(

n2

)演算法複雜度o(n^2)

演算法複雜度o

(n2)

/**

* 選擇排序

* @param nums

*/private

static

void

selectsort

(int

nums)

} nums[index]

= nums[i]

; nums[i]

= min;

}}

歸併排序的思想是,利用二分的特性,將序列分成兩個子串行進行排序,將排序後的兩個子串行歸併(合併),當序列的長度為2時,它的兩個子串行長度為1,即視為有序,可直接合併,即達到歸併排序的最小子狀態

需要o(n)的輔助空間。歸併排序是穩定的。

算 法復

雜度o(

nlog

n)

演算法複雜度o(nlogn)

演算法複雜度o

(nlo

gn)

/**

* 歸併排序

* @param nums

*/private

static

void

guibingsort

(int

nums)

private

static

void

gbsort

(int

nums,

int start,

int end)

}private

static

void

merge

(int

nums,

int left,

int mid,

int right)

else

}while

(leftstart<= mid)

while

(rightstart<=right)

for(

int i =

0;i)}

與歸併排序類似,也是分治,但是不同的是,快速排序是選定乙個值,將陣列中比這個值大的放在右邊,比這個值小的放在左邊,一輪排序下來之後,返回中間mid值,根據mid值將陣列分為左右兩個部分再次排序。

快速排序利用分而治之的思想,它的最好和平均實際複雜度為o(nlogn),但是,如果選取基準的規則正好與實際數值分布相反,例如我們選取第乙個數為基準,而原始序列是倒序的,那麼每一輪迴圈,快排都只能把基準放到最右側,故快排的最差時間複雜度為o(n2)。快排演算法本身沒有用到額外的空間,可以說需要的空間為o(1);對於遞迴實現,也可以說需要的空間是o(n),因為在遞迴呼叫時有棧的開銷,當然最壞情況是o(n),平均情況是o(logn)。快速排序是不穩定的。

quick

(nums,

0,nums.length-1)

;/**

* 快速排序

* @param nums

* @param start

* @param end

*/private

static

void

quick

(int

nums,

int start,

int end)

}private

static

intquicksort

(int

nums,

int start,

int end)

nums[start]

= val;

return start;

}

父節點為i 左子節點為(2i+1) 右子節點為 2(i+1) 子節點為i 父節點為 (i-1)/2

可以從上往下建堆,也可以從下往上建堆,建堆,分為大頂堆和小頂堆,每次完成建堆之後,將堆頂也就是index=0這個位置的數與陣列最後乙個數交換,如果從小到大排序,則建立大頂堆,反之小頂堆,一次迴圈建堆可能存在堆沒有完全建成,所以我使用了乙個變數max或者min來儲存,一次建堆之後判斷堆頂是不是最大值或者最小值,若不是則繼續建堆,若是則交換第乙個數與最後乙個數,以此類推

算 法復

雜度o(

nlog

n)

演算法複雜度o(nlogn)

演算法複雜度o

(nlo

gn)

/**

* 堆排序

* 父節點為i

* 左子節點為(2*i+1) 右子節點為 2*(i+1)

** 子節點為i 父節點為 (i-1)/2

* @param nums

*/private

static

void

heapsort

(int

nums)

}private

static

void

heapbig

(int

nums,

int end)if(

2*(index+1)

<=end&&nums[index]

< nums[2*

(index+1)

])max = math.

max(nums[index]

,max)

; index++;}

if(max !=nums[0]

)else

}private

static

void

heapsmall

(int

nums,

int end)if(

2*(index+1)

<=end&&nums[index]

> nums[2*

(index+1)

])min = math.

min(nums[index]

,min)

; index++;}

if(min !=nums[0]

)else

}

以上就是6中排序方法,以此記錄一下

java實現6種排序演算法

典型的二分查詢 對於二分查詢演算法要求,查詢前的資料必須是已經排好序的,然後得到陣列的開始位置start和結束位置end,取中間位置mid的資料a mid 跟待查詢資料key進行比較,若 a mid key,則取end mid 1 若 a mid key,則取start mid 1 若 a mid ...

6種內部排序演算法 Java實現

一 直接插入排序 待排序陣列 a 0.n 1 排序思路 首先我們認為a 0 是已經排好序的,在排序過程中,依次將a i i 1,2,n 1 從後往前插入到前面已經 排 好序的子陣列a 0.i 1 中的適當位置中,待所有的a i 插入完畢,即排序完畢。演算法如下 空間上,該演算法僅需要常數個輔助單元,...

JAVA基礎 6種常用排序演算法

各種排序的時間 空間複雜度 穩定性是指排序中 相同的數在排序前後,他們的 相對位置不會發生改變。1.直接插入排序 經常碰到這樣一類排序問題 把新的資料插入到已經排好的資料列中。將第乙個數和第二個數排序,然後構成乙個有序序列 將第三個數插入進去,構成乙個新的有序序列。對第四個數 第五個數 直到最後乙個...