排序的介绍
默认从小到大排序
值相等,相对位置没有发生改变则是稳定的排序
内部排序
:数据元素全部放在内存中的排序。(我们所讲一般是内部排序)
外部排序
:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
差入排序
public static void insertSort(int[] array){
for (int i = 1; i < array.length; i++) {
int tmp=array[i];//i-1后面那个数
int j = i-1;
for (; j>=0 ; j--) {
//这里加不加等号和稳定有关系
//但是本身就是一个稳定的排序可以实现为不稳定的排序
//本身是一个不稳定的排序不可以变成一个稳定的排序
if (array[j]>tmp){
array[j+1]=array[j];
}else {
break;
}
}
array[j+1]=tmp;//后面的值都给前面的数了,最后一个附最小的值
}
}
希尔排序
分成5、3、1分别排序,后插入排序
//希尔排序
public static void shellSort(int[] array){
int gap=array.length;
while (gap>1){
gap/=2;
shell(array,gap);
}
}
public static void shell(int[] array,int gap){
for (int i = gap; i < array.length; i++) {
int tmp=array[i];//i-1后面那个数
int j = i-gap;
for (; j>=0 ; j-=gap) {
//这里加不加等号和稳定有关系
//但是本身就是一个稳定的排序可以实现为不稳定的排序
//本身是一个不稳定的排序不可以变成一个稳定的排序
if (array[j]>tmp){
array[j+gap]=array[j];
}else {
break;
}
}
array[j+gap]=tmp;//后面的值都给前面的数了,最后一个附最小的值
}
}
选择排序
思路:
i先记录0下标,j从1小标开始走,当j下标对应的值小于i下标对应的值时,i下标对应的值就与j下标对应的值交换,j下标继续往前比较,比完一轮i++
lic class Select {
private static void swap(int[] array,int i,int j){
int tmp=array[i];
array[i]=array[j];
array[j]=tmp;
}
public static void selectSort(int[] array){
for (int i = 0; i < array.length; i++) {
int minIdex=i;
for (int j = i+1; j < array.length; j++) {
if (array[j]<array[minIdex]){
minIdex=j;
}
}
//走完一轮之后找到最小值进行交换
swap(array,i,minIdex);
}
}
}
双向选择排序
public static void selectSort2(int[] array){
int left=0;
int right=array.length-1;
while (left<right){
int minIndex=left;
int maxIndex=left;
for (int i = left+1; i <=right ; i++) {
if (array[i]<array[minIndex]){
minIndex=i;
}
if (array[i]>array[maxIndex]){
maxIndex=i;
}
}
swap(array,minIndex,left);
//防止第一个是最大值,如果和最小的一换,最大值就跑到了原来的最小值位置
if (maxIndex==left){
maxIndex=minIndex;
}
swap(array,maxIndex,right);
left++;
right--;
}
}