publicclassSelection{public statice voidsort(String[] a){
int len = a.length;
for (int i = 0; i < len-1; i++){
int min = i;
int temp;
for (int j = i+1; j < len; j++){
if ( a[j] < a[min]){
min =j;
}
temp = a[min]; a[min] = a[i]; a[i] = a[min];
}
}
}
}
堆排序
时间复杂度为O(nlogn),空间复杂度为O(1)。
堆排序借用堆数据结构,二叉堆。
二叉堆的性质:父节点的键值总是>=子节点键值;每个节点都是一个一个二叉堆。
经常用在 大数Top K问题上。
publicclassHeapSort{privateint[] arr;
publicvoidHeapSort(int[] arr){
this.arr = arr;
}
/*堆有序第一步
*数据化堆
*/for (int i = arr.length/2; i > 0; i--){
heapAdjust(arr, i, arr.length);
}
/*堆有序第二步
*堆排序
*/for(int i = arr.length - 1; i > 0; i--){
swap(arr, 0, i);
heapAdjust(arr, 0, i);
}
/* 构建堆的过程
* @param arr 需要排序的数组
* @param i 需要构建堆的根节点的序号
* @param n 数组的长度
*/privatestaticvoidheapAdjust(int[] arr, int i, int n){
while (2*i+1 < n){
int j = 2*i+1;
if (j < n && (arr[j] < arr[j+1]))
j++;
if (!(arr[j] < arr[k]))
break;
exch(arr, k, j);
k = j;
}
privatestaticintexch(int[] arr, int i, int n){
int t = arr[i];
arr[i] = arr[n];
arr[n] = t;
}
}
}
插入排序
直接插入排序
将其余所有元素插入到之前的元素中。
当前索引左边的都是有序数列。
插入排序所需时间,取决于当前的初始顺序,因此对非随机数组更有效。
publicvoidInsertSort(int[] arr){
for (int i = 1; i < arr.length; i++){
if (a[i] < a[i-1]){
int j = i-1;
int x = a[i];
a[i] = a[i-1];
while(x < a[j]){
a[j+1] = a[j];
j--;
}
a[j] = x;
}
}
}
希尔排序
基于插入排序,快速算法。
交换不相邻的元素,以对数组局部最优;然后用插入排序对局部最优排序。
任意间隔h的元素都是有序。
publicvoidshellSort(int[] arr, int n){
int dk = n/2;
while(dk >= 1){
ShellInsertSort(arr, n, dk);
dk = dk/2;
}
privatevoidShellInsertSort(int[] arr, int n, int dk){
for (int i = dk; i < n; i++){
if (a[i] < a[i-dk]){
int j = i-dk;
int x = a[i]
while(x < a[j]){
a[j+dk] = a[j];
j -= dk;
}
a[j] = x;
}
}
}
}