手撕7大排序

2021-09-29 15:11:46 字數 4327 閱讀 1600

一些小工具

//如果ab,返回1,a=b,返回0,apublic

static

boolean

less

(comparable a,comparable b)

//交換倆個元素

public

static

void

swap

(comparable[

] nums,

int i,

int j)

//列印乙個陣列

public

static

void

print

(comparable[

] nums)

system.out.

println

(str+

"]")

;}

氣泡排序

//氣泡排序

public

static

void

babooboo

(comparable[

] nums)

}}

選擇排序

每次從陣列裡選擇最大(小)的元素,放在待排序陣列的末尾/開頭

/*選擇排序

* */

public

static

void

choicesort

(comparable[

] nums)

}//返回子陣列裡最小元素的下標

public

static

intfindmin

(comparable[

] nums,

int begin,

int end)

}return index;

}

插入排序

先假定乙個陣列裡的子陣列有序,可以把陣列的第乙個元素看成乙個有序的子陣列,然後,把其後的元素插入該子陣列得到有序陣列

//下面是插入排序

public

static

void

insertsort

(comparable[

] nums)}}

}

希爾排序

插入排序的公升級版,把間隔為h距離的數組成乙個新陣列,對新陣列進行排序,不斷縮小h直到h為1,最後得到的就是乙個有序陣列

//希爾排序

public

static

void

xiersort

(comparable[

] nums)

while

(h>=1)

}}h = h/3;

}}

快速排序

在有序陣列中任意拿出乙個元素,其左邊的元素均小於等於該元素,其右邊的元素都大於等於該元素,逆推可得若從乙個陣列裡拿出任意乙個元素,其左邊的元素都小於等於該元素,其右邊的元素都大於等於該元素,則元素有序。通過程式來實現逆推的這種說法則為快速排序。

快速排序就是選取基值,把比基值小的放在基值的左邊,比基值大的放在基值的右邊,再根據基值的左邊和右邊劃分倆個子陣列,對子陣列重複這一過程;直到陣列大小為1。

用程式表示上述過程即快速排序

//下面是快速排序

public

static

void

qsort

(comparable[

] nums)

public

static

void

qsort

(comparable[

] nums,

int begin,

int end)

int mid =

pattern

(nums, begin, end)

;qsort

(nums,begin,mid-1)

;qsort

(nums,mid+

1,end);}

public

static

intpattern

(comparable[

] nums,

int begin,

int end)

swap

(nums,begin,j)

;return j;

}

堆排序

使用堆實現乙個優先佇列,優先佇列能從尾部插入資料和從頭部彈出資料,使用堆來保證每次彈出的數字都為陣列裡最大的數字

優先佇列

public

class

handtearqueue

comparable

>

}private

boolean

less

(int i,

int j)

private

void

swap

(int i,

int j)

//從上至下構造堆

public

void

sink

(int a)

}//從下至上構造堆

public

void

swim

(int a)

swap

(a/2

,a);

a/=2;

}}//從堆中插入

public

void

insert

(key key)

//從堆中刪除

public key delmax()

}

堆排序

//堆排序

public

static

void

stacksort

(comparable[

] nums)

}

歸併排序

基本思想是把倆個有序陣列合併為乙個有序陣列,不斷遞迴,分割陣列的長度為1,再將倆個長度為1的陣列合併為乙個有序的陣列。。。不斷向上,直到合併為和原陣列大小相同的有序陣列

為了節省空間,使用乙個類來實現歸併排序

public

class

handtearmerge

//如果apublic

boolean

less

(comparable a,comparable b)

public

void

sort

(comparable[

] nums)

public

void

sort

(comparable[

] nums,

int begin,

int end)

int mid =

(begin+end)/2

;sort

(nums, begin, mid)

;sort

(nums, mid+

1, end)

;marge

(nums,begin,mid,end);}

public

void

marge

(comparable[

] nums,

int begin,

int mid,

int end)

for(

int k = begin; k <= end; k++

)else

if(j > end)

elseif(

less

(aux[i]

,aux[j]))

else}}

}

歸併排序

//歸併排序

public

static

void

mergingsort

(comparable[

] nums)

手撕演算法 排序

時間複雜度o n 2 o n 2 o n2 空間複雜度 o 1 穩定 從第乙個元素開始,認為左邊的序列是有序的,從有序部分的最後乙個向前比較,如果當前元素小於有序部分就交換,否則比較下乙個元素。function insertmerge arr else return arr let arr 1 5,...

演算法 手撕堆排序

時間複雜度 o n logn o nlogn o nlog n 但是實際軟開中,快排效能更好。堆性質 堆排序 從小到大,利用最大堆和陣列 從後往前堆化陣列元素,此時最大元素在首位置 交換元素堆化 include include using namespace std void heapsort in...

Python手撕排序演算法

氣泡排序 公升序 歸併排序 公升序 分而治之 每次在若干無序資料中查詢最小數,放在無序資料的首位。1.從n個元素的列表中找最小值及其下標,與第乙個元素交換 2.從第二個元素開始的n 1個元素中找最小值及其下標,與第二個元素交換 3.以此類推,n 1輪後即為排好序的資料 a 49 38,65 97,7...