基础算法(排序算法)
本系类介绍一些简单的基础排序算法;包括冒泡排序,插入排序,选择排序,希尔排序,等。本文暂介绍插入排序法和选择排序法。
2 插入排序(Insertion Sort)
2.1 插入排序(基本)
插入排序,顾名思义,依靠“插入”操作进行排序;在本文中,使用数组 nums{3,2,6,4,1,8,9,3}; 默认目标为升序排序。
插入排序的基本思想是,将后一个元素与之前元素相比较,插入到合适的位置;
插入排序的主要步骤如上图;需要注意的是,我们在一开始,假定第0号位为有序,即从第1号位开始进行插入排序。
代码实现如下:
/**
*插入排序
*
*/
public static int[] insertSort(int[] nums){
if (nums.length==0){
return nums;//如果数组为空,不用排序
}
for (int i=1;i<nums.length;i++){
//外层循环,从1号位(第二个开始)
for (int j=i;j>0;j--){
//内层循环,与排好序的子序列元素比较,如果后面的数据小于前面的,则交换
if (nums[j]<nums[j-1]){
int temp=nums[j-1];
nums[j-1]=nums[j];
nums[j]=temp;
}else {
//如果不小于,则退出内层循环
break;
}
}
}
return nums;
}
插入排序的关键点在于“插入”操作,在代码上,“插入”操作体现在将目标元素与有序子数组的元素进行比较;如果小于则交换。
测试:
测试结果:
3 选择排序(Selection Sort)
3.1选择排序(基本)
选择排序就是在无序子数组中寻找最小的值,放到第0号位,第0号位称为有序子数组;再在剩下的无需子数组中寻找最小值与1号位交换,此时有序子数组增长一位,无需子数组减少一位 然后重复此操作
代码实现:
/**
*插入排序
*/
public static int[] selectionSort(int[] nums){
if (nums.length==0){
return nums;//如果数组为空,不用排序
}
for(int i=0;i< nums.length;i++){
int minIndex=i;
for (int j=i;j<nums.length;j++){
if (nums[j]<nums[minIndex]) {
minIndex = j;//将最小数字的下标保存
}
}
int temp=nums[minIndex];
nums[minIndex]=nums[i];
nums[i]=temp; //交换
}
return nums;
}
值得注意的是,在代码中,最小元素的确定是通过for循环;保存其下标,再进行交换。
测试:
运行结果: