插入排序
直接插入
把n个待排序的元素看成一个有序表和一个无序表。开始时有序表中只包含一个元素,即第一个元素,无序表中有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它插入到有序表中适当位置。
for(int i=1;i<arr.length;i++){
int insertVal=arr[i];//待插入的数
int insertIndex=i-1;//记录互换数下标(初始为待插入数前面一个数的下标)
while(insertIndex>=0 && insertVal<arr[insertIndex]){
arr[insertIndex+1]=arr[insertIndex];
insertIndex--;
}
arr[insertIndex+1]=insertVal;//注意退出while循环多减了一次,这里加回来
}
希尔排序
多次分组,对每个分组进行插入排序
for(int gap=arr.length/2;gap>0;gap/=2){
for(int i=gap;i<arr.length;i++){
for(int j=i-gap;j>=0;j-=gap){
if(arr[j]>arr[j+gap]{
temp=arr[j];
arr[j]=arr[j+gap];
arr[j+gap]=temp;
}
}
}
}
选择排序
简单选择排序
第一次从arr[0]-arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]-arr[n-1]中选取最小值,与arr[1]交换…
for(int i=0;i<arr.length-1;i++){
int minIndex=i;//记录该轮最小值坐标(最小值先假设为第一个数)
int min=arr[i];//记录该轮最小值(最小值先假设为第一个数)
for(int j=i+1;j<arr.length;j++){
if(arr[j]<min){
min=arr[j];
minIndex=j;
}
}
if(minIndex!=i){
//该轮循环结束,进行交换
arr[minIndex]=arr[i];
arr[i]=min;
}
}
堆排序
堆:
基本思想:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。