氣泡排序
選擇排序
歸併排序
快速排序
堆排序插入排序,顧名思義肯定是已插入為主,將待排序的陣列分為已排序(陣列前部分)和未排序(陣列後部分),這裡我們已從小到大排序,陣列為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.直接插入排序 經常碰到這樣一類排序問題 把新的資料插入到已經排好的資料列中。將第乙個數和第二個數排序,然後構成乙個有序序列 將第三個數插入進去,構成乙個新的有序序列。對第四個數 第五個數 直到最後乙個...