int temp = 0;
for (int i = a.length - 1; i > 0; --i) {
for (int j = 0; j < i; ++j) {
if (a[j + 1] < a[j]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
最差时间复杂度:O(n2)
最优时间复杂度:O(n):在遍历时,如果有设定标记,对于已排序的数组,可以实现 O(n)
平均时间复杂度:O(n2)
最差空间复杂度:总共 O(n),需要辅助空间 O(1)
稳定性:稳定
插入排序
使用插入排序为一列数字进行排序的过程如下图:
Java 实现
12345678910
for(int index=1;index<data.length;index++){
Comparable key = data[index];
int position = index;
//shift larger values to the right
while(position>0&&data[position-1].compareTo(key)>0){
data[position] = data[position-1];
position--;
}
data[position]=key;
}
最差时间复杂度:O(n2)
最优时间复杂度:O(n):顺序的情况。
平均时间复杂度:O(n2)
最差空间复杂度:总共 O(n) ,需要辅助空间 O(1)
稳定性:稳定
选择排序
使用选择排序为一列数字进行排序的过程如下图:
Java 实现
1234567891011
for (int index = 0; index < array.length - 1; index++) {
min = index;
for (int time = index + 1; time < array.length; time++) {
if (array[time].compareTo(array[min]) < 0) {
min = time;
}
}
temp = array[index];
array[index] = array[min];
array[min] = temp;
}
public void sort (int[] input){
sort (input, 0, input.length-1);
}
private void sort(int[] input, int lowIndex, int highIndex) {
if (highIndex<=lowIndex){
return;
}
int partIndex=partition (input, lowIndex, highIndex);
sort (input, lowIndex, partIndex-1);
sort (input, partIndex+1, highIndex);
}
private int partition(int[] input, int lowIndex, int highIndex) {
int i=lowIndex;
int pivotIndex=lowIndex;
int j=highIndex+1;
while (true){
while (less(input[++i], input[pivotIndex])){
if (i==highIndex) break;
}
while (less (input[pivotIndex], input[--j])){
if (j==lowIndex) break;
}
if (i>=j) break;
exchange(input, i, j);
}
exchange(input, pivotIndex, j);
return j;
}