1.选择排序
原理:每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元素排完 。
代码示例:
public class sort{
//1.时间复杂度:无论数据是否有序,都是O(N^2)
//2.空间复杂度:O(1)
//3.稳定性:不稳定 有跳跃式交换
public static void selectSort(int[] array){
for (int i = 0; i <array.length ; i++) {
//j每次从i的后一个元素开始与前面元素进行比较
for (int j = i+1; j <array.length ; j++) {
if(array[i]>array[j]){
int tmp=array[i];
array[i]=array[j];
array[j]=tmp;
}
}
}
}
public static void main(String[] args) {
int [] array={2,5,9,34,6,8,33,56,89,0,7,4,22,55,77};
selectSort(array);
System.out.println(Arrays.toString(array));
}
运行结果:
[0, 2, 4, 5, 6, 7, 8, 9, 22, 33, 34, 55, 56, 77, 89]
}
2.shell排序
希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。
(1). 希尔排序是对直接插入排序的优化。
(2).当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
下面是分为5组的情况,i从第一组的第二个元素开始,j从第一个元素开始。
代码示例:
//直接插入排序,gap为组数。gap的取值没有确定的范围,一般取质数比较好,且取的组数呈现递减,最后一个将所有数据看成一组进行排序。
public static void shell(int []array,int gap){
for (int i = gap; i <array.length ; i++) {
int j;
int tmp=array[i];
for (j = i-gap; j >=0 ; j=j-gap) {
if(array[j]>tmp){
array[j+gap]=array[j];
} else{
//前面已经有序了
break;
}
}
array[j+gap]=tmp;
}
}
//1.时间复杂度:最坏情况O(N^2)最好是O(N)
//2.空间复杂度:O(1)
//3.稳定性:不稳定
public static void shellSort(int []array){
int [] drr={5,3,1};
for (int i = 0; i <drr.length ; i++) {
shell(array,drr[i]);
}
}
public static void main(String[] args) {
int [] array={2,5,9,34,6,8,33,56,89,0,7,4,22,55,77};
shellSort(array);
System.out.println(Arrays.toString(array));
}
运行结果:
[0, 2, 4, 5, 6, 7, 8, 9, 22, 33, 34, 55, 56, 77, 89]