选择排序(每一趟选出一个最大/最小记录,与序列的首个/最后一个记录交换)
最简单选择排序思路:从头到尾顺序扫描,选出最小的和第一个交换,从接下来的记录重复上述步骤
voidselectSort(int[] R){
intn=R.lenth;
for(inti=0;i<n;i++){
intmin=i;
//将a[i]和a[i+1...n]中最小元素交换
for(intj=i+1;j<n;j++){
if(R[j]<R[min]) min=j;
inttemp=R[i];R[i]=R[j];R[j]=temp;
}
}
}
对于长度为n的数组,选择排序需要大约n2/2次比较和N次交换。
选择排序运行时间和输入无关,时间复杂度为O(n2);选择排序数据移动最小。
通过交换相邻元素进行排序任何算法的平均时间复杂度都为O(n2);
插入排序(队伍已经排好,插入到合适的位置)
最差时间复杂度为O(n2),最好时间复杂度为O(n)
直接插入排序思路:每一趟将一个待排序关键字,插入到前序列的相应位置(不断与前面比,一张张移动)
voidinsertSort(int[] nums){
intn=nums.length;
for(inti=1;i<n;i++){
//把待排关键字temp插入到0-j的队伍中
inttemp=nums[i];int j=i-1;
while(j>=0&&temp<a[j]){
nums[j+1]=nums[j];
j--;
}
nums[j+1]=temp;
}
}
折半插入排序思路:基于折半查找,找到应该插入的位置
void binaryInsertSort(int[] nums){
intn=nums.length;
for(inti=1;i<n;i++){
inttemp=nums[i];
intleft=0,right=i-1;
//折半查找到要插入的位置
while(left<=right){
intmid=left+(right-left)/2;
if(temp<nums[mid])
right=mid-1;
else
left=mid+1;
}
for(intj=i-1;j>=left;j--)
nums[j+1]=nums[j];
nums[left]=temp;
}
}
希尔排序思路:使任意间隔为h的独立元素都是有序的。实现方法是对于每一个h,用插入排序将n个子数独立的排序,相当于只要将插入排序的1改为h即可。
voidshellSort(int[] nums){
intn=nums.length;
}