一些小工具
氣泡排序//如果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
(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...