冒泡排序 O(n²)
public static void bubbleSort(int[] array){
int length = array.length;
if(length <= 1){
return;
}
for(int i = 0; i < length; i++){
boolean flag = true;
for(int j = 0; j <length - i - 1; j++){
if(array[j] > array[j+1]){
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
flag = false;
}
}
if(flag){
break;
}
}
}
插入排序 O(n²)
public static void insertionSort(int[] arr){
int len = arr.length;
if(len <= 1){
return;
}
for(int i = 1; i < len; i++){
int current = arr[i];
int preIndex = i - 1;
while(preIndex >= 0 && arr[preIndex] > current){
arr[preIndex+1] = arr[preIndex];
preIndex--;
}
arr[preIndex+1] = current;
}
}
选择排序(不稳定) O(n²)
public static void selectionSort(int[] arr){
int len = arr.length;
if(len <= 1){
return;
}
for(int i = 0; i < len; i++){
int minIndex = i;
for(int j = i; j < len; j++){
if(arr[minIndex] > arr[j]){
minIndex = j;
}
}
int current = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = current;
}
}
归并排序 O(n*log(n))
拆分(排序实现函数)
public static int[] mergeSort(int[] arr){
if(arr.length < 2){
return arr;
}
int mid = arr.length / 2;
int[] left = Arrays.copyOfRange(arr,0,mid);
int[] right = Arrays.copyOfRange(arr,mid,arr.length);
return merge(mergeSort(left),mergeSort(right));
}
合并(在排序函数中调用)
public static int[] merge(int[] left,int[] right){
int[] newArray = new int[left.length+right.length];
int lindex = 0;
int rindex = 0;
for(int i = 0; i < newArray.length; i++){
if(lindex >= left.length){
newArray[i] = right[rindex++];
}else if(rindex >= right.length){
newArray[i] = left[lindex++];
}else if(left[lindex] < right[rindex]){
newArray[i] = left[lindex++];
}else{
newArray[i] = right[rindex++];
}
}
return newArray;
}
快速排序(不稳定) O(n*log(n))
public static void quickSort(int[] arr,int begin,int end){
if(arr.length <= 1 || begin >= end){
return;
}
int pivotlndex = partition(arr,begin,end);
quickSort(arr,begin,pivotlndex-1);
quickSort(arr,pivotlndex+1,end);
}
private static int partition(int[] arr,int begin,int end){
int pivot = arr[end];
int piovtIndex = begin;
for(int i = begin; i < end; i++){
if(arr[i] < pivot){
if(i > piovtIndex){
swap(arr,i, piovtIndex);
}
piovtIndex++;
}
}
swap(arr, piovtIndex,end);
return piovtIndex;
}
private static void swap(int[] arr,int i,int j){
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
桶排序 O(n)
package sort;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class BucketSort {
public List<Integer> bucketSort(List<Integer> array,int bucketSize){
if(array == null || array.size() < 2 || bucketSize < 1){
return array;
}
int max = array.get(0);
int min = array.get(0);
for(int i = 0; i < array.size(); i++){
if(array.get(i) > max){
max = array.get(i);
}
if(array.get(i) < min){
min = array.get(i);
}
}
int bucketCount = (max - min) / bucketSize + 1;
List<List<Integer>> bucketList = new ArrayList<>();
for(int i = 0; i < bucketCount; i++){
bucketList.add(new ArrayList<Integer>());
}
for(int j = 0; j < array.size(); j++){
int bucketIndex = (array.get(j) - min) / bucketSize;
bucketList.get(bucketIndex).add(array.get(j));
}
List<Integer> reustList = new ArrayList<>();
for(int j = 0; j < bucketList.size(); j++){
List<Integer> everyBucket = bucketList.get(j);
if(everyBucket.size() > 0){
if(bucketCount == 1){
bucketSize--;
}
List<Integer> temp = bucketSort(everyBucket,bucketSize);
for(int i = 0; i < temp.size(); i++){
reustList.add(temp.get(i));
}
}
}
return reustList;
}
@Test
public void testBucketSort(){
List<Integer> list = new ArrayList<>();
list.add(5);
list.add(2);
list.add(2);
list.add(6);
list.add(9);
list.add(0);
list.add(3);
list.add(4);
System.out.println(list);
List<Integer> bucketSort = bucketSort(list, 2);
System.out.println(bucketSort);
}
}
计数排序 O(n)
package sort;
import org.junit.Test;
import java.util.Arrays;
public class CountingSort {
public void countingSort(int[] array) {
int max = array[0];
int min = array[0];
for (int i = 0; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
if (array[i] < min) {
min = array[i];
}
}
int bucketSize = (max - min) + 1;
int[] bucket = new int[bucketSize];
for (int i = 0; i < array.length; i++) {
int bucketIndex = array[i] - min;
bucket[bucketIndex] += 1;
}
for (int i = 1; i < bucket.length; i++) {
bucket[i] = bucket[i] + bucket[i - 1];
}
int[] temp = new int[array.length];
for (int i = array.length - 1; i >= 0; i--) {
int bucketIndex = array[i] - min;
temp[bucket[bucketIndex]-1] = array[i];
bucket[bucketIndex] -= 1;
}
for(int i = 0; i < temp.length; i++){
array[i] = temp[i];
}
}
@Test
public void testCountingSort(){
int[] array = new int[8];
array[0] = 5;
array[1] = 2;
array[2] = 6;
array[3] = 9;
array[4] = 0;
array[5] = 3;
array[6] = 3;
array[7] = 4;
System.out.println(Arrays.toString(array));
countingSort(array);
System.out.println(Arrays.toString(array));
}
}