稳定性算法:冒泡排序、插入排序、归并排序、基数排序
不稳定性算法:选择排序、快速排序、堆排序、希尔排序、桶排序
/**
*
* @author huangsen
* 插入排序:一个有序数组,一个无序数组,将无序数组插入到有序数组中
*
*/
public class InsertSortDemo {
public static void insertSort(int[] arr) {
for(int i = 1; i < arr.length; i++) {
int temp = arr[i];
int j;
for(j = i -1; j>=0; j--) {
if(temp > arr[j]) {
break;
}else {
arr[j+1] = arr[j];
}
}
arr[j+1] = temp;
}
}
}
package com.hs.sort;
/**
*
* @author huangsen
* 归并排序:采用分治思想,对一个数组的排序,我们可以将他分成两个数组来处理,再对这两个数组同样的道理来处理,
* 将他们分别分成两个数组来处理…… 直到数组无法再细分下去(即数组的长度为1,只有一个元素的数组肯定是有序的),
* 分为之后的数组进行合并操作,向上整合整个数组,最后到达得到一个有序的数组的目的。
*
*/
public class MergeSortDemo {
public static void mergeSort(int[] arr, int start, int end) {
if(start<end) {
int mid = (start + end)/2;
mergeSort(arr, start, mid);
mergeSort(arr,mid + 1, end);
merge(arr, start, mid, mid + 1, end);
}
}
public static void merge(int[] arr, int start1, int end1, int start2, int end2) {
int i = start1;
int j = start2;
int k = 0;
int[] a = new int[end2-start1+1];
while((i<=end1) && (j<=end2)) {
if(arr[i]<arr[j]){
a[k] = arr[i];
k++;
i++;
}else {
a[k] = arr[j];
k++;
j++;
}
}
while(i<=end1) {
a[k++] = arr[i++];
}
while(j<=end2) {
a[k++] = arr[j++];
}
for(int m = 0; m<a.length; m++)
arr[m+start1] = a[m];
}
}
package com.hs.sort;
/**
* @author huangsen
* 选择排序:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
*
*/
public class SelectSortDemo {
public static void selectSort(int[] arr) {
for(int i = 0; i<arr.length; i++) {
int k = i;
for(int j = i+1; j<arr.length; j++) {
if(arr[j]<arr[k]) {
k = j;
}
}
if(k>i) {
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
}
}