1、冒泡算法
public void bubbleSortOpt(int[] arr) {
int temp = 0;
for(int i = 0; i < arr.length - 1; i++) {
for(int j = 0; j < arr.length - i - 1; j++) {
if(arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
2、快速排序
public void quicksort(int[] arr, int start, int end) {
if(start < end) {
int stard = arr[start];
int low = start;
int high = end;
while(low < high) {
while(low < high && arr[high] >= stard) {
high--;
}
arr[low] = arr[high];
while(low < high && arr[low] <= stard) {
low++;
}
arr[high] = arr[low];
}
arr[low] = stard;
quickSort(arr, start, low);
quickSort(arr, low + 1, end);
}
}
3、直接插入排序
public void insertSort(int[] arr) {
for(int i = 1; i < arr.length - 1; i++) {
if(arr[i] < arr[i - 1]) {
int j;
int temp = arr[i];
for(j = i - 1; j >= 0 && arr[j] > temp; j--) {
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
4、希尔排序
public void shellSort(int[] arr) {
for (int gap = arr.length / 2; gap > 0; gap /= 2) {
for (int i = 0 ;i < gap; i++) {
for (int j = i + gap; j < arr.length; j += gap) {
if (arr[j] < arr[j - gap]) {
int k;
int temp = arr[j];
for (k = j - gap; k >= 0 && arr[k] > temp; k -= gap) {
arr[k + gap] = arr[k];
}
arr[k + gap] = temp;
}
}
}
}
}
5、选择排序
public static void selectSort(int[] array){
for (int bound = 0; bound < array.length-1 ; bound++) {
for(int cur = bound+1;cur < array.length;cur++){
if(array[bound] > array[cur]){
int temp = array[bound];
array[bound] = array[cur];
array[cur] = temp;
}
}
}
}
6、堆排序
public static void heapSort(int[] array){
CreatHeap(array);
for (int i = 0; i < array.length-1; i++) {
swap(array,0,array.length-1-i);
shiftDown(array,array.length-i-1,0);
}
}
public static void CreatHeap(int[] array) {
for(int i = (array.length-1-1)/2;i >=0;i--){
shiftDown(array,array.length,i);
}
}
public static void shiftDown(int[] array, int heapLength, int index) {
int parent = index;
int child = index*2 +1;
while(child <heapLength){
if(child+1 < heapLength && array[child+1] > array[child]){
child = child +1;
}
if(array[child] > array[parent]){
swap(array,child,parent);
}
parent = child;
child = parent*2+1;
}
}
public static void swap(int[] array,int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
7、归并排序
public static void merge(int[] arr, int low, int middle, int high) {
int[] temp = new int[high - low + 1];
int i = low;
int j = middle + 1;
int index = 0;
while (i <= middle && j <= high) {
if (arr[i] <= arr[j]) {
temp[index] = arr[i];
i++;
} else {
temp[index] = arr[j];
j++;
}
index++;
}
while (i <= middle) {
temp[index] = arr[i];
i++;
index++;
}
while (j <= high) {
temp[index] = arr[j];
j++;
index++;
}
for (int k = 0; k < temp.length; k++) {
arr[k + low] = temp[k];
}
}
public static void mergeSort(int[] arr, int low, int high) {
int middle = (high + low) / 2;
if (low < high) {
mergeSort(arr, low, middle);
mergeSort(arr, middle + 1, high);
merge(arr, low, middle, high);
}
}
8、基数排序
public static void radixSort(int[] arr) {
int max = Integer.MIN_VALUE;
for (int value : arr) {
if (value > max) {
max = value;
}
}
int maxLength = (max + "").length();
int[][] temp = new int[10][arr.length];
int[] counts = new int[10];
for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
for (int j = 0; j < arr.length; j++) {
int remainder = arr[j] / n % 10;
temp[remainder][counts[remainder]] = arr[j];
counts[remainder]++;
}
int index = 0;
for (int k = 0; k < counts.length; k++) {
if (counts[k] != 0) {
for (int l = 0; l < counts[k]; l++) {
arr[index] = temp[k][l];
index++;
}
counts[k] = 0;
}
}
}
}