选择排序:选择排序的思想是从一个无序队列当中找到一个最小值,并将其与第一个数值进行交换,之后再从除第一个数值外的无序队列中找出最小的数值,并将其与第二个数值进行交换,再从除第一个,第二个数值外的无序队列中找最小的数值,以此下去.....
插入排序:插入排序的思想是将无序队列的第一个数值作为有序队列,之后从除第一个数值的无序队列中依次取出数值与前面的有序队列进行比较,找到合适的位置进行放入,组成一个新的有序队列。依次下去直至无序队列转换成有序队列......
插入排序和选择排序的java代码示例如下:
import java.util.Scanner;
public class Sort {
/**
* 选择排序
* @param arr
*/
public static void selection(int[] arr)
{
//选择排序的优化
int t;
for(int i = 0; i < arr.length - 1; i++) {// 做第i趟排序
int k = i;
for(int j = k + 1; j < arr.length; j++){// 选最小的记录
if(arr[j] < arr[k]){
k = j; //记下目前找到的最小值所在的位置
}
}
//在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换
if(i != k){ //交换a[i]和a[k]
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
t=i+1;
System.out.print("第"+t+"次选择排序后的数组:");
printArray(arr);
}
}
/**
* 插入排序
* @param nums
*/
public static void insertion(int[] nums)
{
//默认构造从左→右依次递增的序列
for(int i=1; i<nums.length; i++){
int j;
int temp = nums[i]; //temp是本趟待插入的数,之前从0~i-1的数全是从左→右有序递增。
for(j=i-1; j>=0&&nums[j]>temp; j--){
nums[j+1] = nums[j];
}
nums[j+1] = temp;
System.out.print("第"+i+"次直接插入排序后的数组:");
printArray(nums);
}
}
/**
* 输入初始数组
* @return
*/
public static int[] buildArray(){
Scanner scan = new Scanner(System.in);
System.out.println("请输入一组整数值,数字之间用','隔开:");
int[] a = null;//创建空数组a
String strs = scan.nextLine();//获取控制台输入信息
//strs存放的是从键盘输入的string类数值
String[] s = strs.split(",");//将字符串转换成字符数组
a = new int[s.length];
for(int i=0; i<a.length; i++){//将字符数组转换成
a[i] = Integer.valueOf(s[i]);
}
return a;
}
//打印数组
public static void printArray(int[] arr){
System.out.print('[');
for(int i=0;i<arr.length-1;i++){//循环输出数组
System.out.print(arr[i]+", ");
}
System.out.println(arr[arr.length-1] + "]");
}
public static void main(String[] args){
int[] nums = buildArray();
System.out.print("您输入的初始数组是 : ");
printArray(nums);
System.out.println("插入排序:");
//insertion(nums);//插入排序方法
System.out.println("选择排序:");
selection(nums);//选择排序方法
}
}
两种算法的显示结果如下:
利用algorithms网站的可视化程序跑出的插入排序视图:
选择排序视图: