Java学习之旅(五)
第三周Java学习重点总结(1)
- 冒泡排序
- 选择排序
- 插入排序
1.冒泡排序
让数组当中相邻的两个数进行比较,数组当中比较小的数值向左移,数值比较大的向右移!外层for循环控制循环次数,内层for循环控制相邻的两个元素进行比较。
例如:
用随机整数生成一个长度为10的数组并排序,数组的值各不相同(1-100),并且计算循环了多少次,交换了多少次,耗时。
Random rand = new Random();
int[] array = new int[10];
int size = 0; //size代表下标
array[size++]= 1+rand.nextInt(100); //得到随机整数
boolean no; //验证模型:
for (int t; size <array.length ; ) {
t = 1+rand.nextInt(100); //
no = true; // 假设数组里的没有重复值,验证数组里面有,
for (int j = 0; j <size ; j++) {
if (array[j]==t){
no = false;
break;
}
}
if (no){
array[size++] = t;
}
}
// System.out.println("排序前:");
// for (int i : array) {
// System.out.println(i);
// }
long circleCount = 0,swapCount = 0;
long begin = System.currentTimeMillis();
// 外层循环控制多少轮
for (int i = 0,t; i <array.length-1 ; i++,circleCount++) {
// 内层循环控制每一轮比较多少次,找左边大的
for (int j = 0; j < array.length-1-i; j++,circleCount++) {
if (array[j]>array[j+1]){
t=array[j];
array[j] = array[j+1];
array[j+1] = t;
swapCount++;
}
}
}
System.out.println("排序后:");
for (int a : array) {
System.out.println(a);
}
System.out.println(MessageFormat.format("循环{0}次,值交换{1}次,耗时{2}秒",
circleCount,swapCount,(System.currentTimeMillis()-begin)/1000.0));
输出结果为:
2.选择排序
选择排序就是每次从一组待排序的数组中找到最小值(或最大值)然后与该序列的起始位置进行替换,以此类推,直到待排序的数组排序好为止。
例如:上题用选择排序
for (int i = 0,maxValIx,maxIx,t; i <array.length-1 ; i++,circleCount++) {
maxValIx = 0;// 假设最大值下标为0,并通过内层循环进程验证调整
maxIx = array.length-1-i;//最大下标在每一轮是固定的
for (int j = 1; j <= maxIx; j++,circleCount++) {
if (array[maxValIx]<array[j]){
maxValIx = j;
}
}
// 判断最大值是否出现在最大下标,若不是则值交换
if (maxValIx != maxIx){
t = array[maxValIx];
array[maxValIx] = array[maxIx];
array[maxIx] = t;
swapCount++;
}
}
System.out.println("排序后:");
for (int i : array) {
System.out.println(i);
}
System.out.println(MessageFormat.format("循环{0}次,值交换{1}次,耗时{2}秒",
circleCount,swapCount,(System.currentTimeMillis()-begin)/1000.0));
输出结果为:
选择排序相较于冒泡排序,值交换的次数少了不少,效率更高,更能节省成本。
3.插入排序
插入排序是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
例如:上题用插入排序
for (int i = 1,t,j; i < array.length; i++,circleCount++) {
// 先拿i和i-1 位置上的值比较,如果i位置上的值大,则自然成序
if (array[i]>=array[i-1]){
continue;
}
// 用临时变量存储i位置的值
t = array[i];
//挪位置
for (j = i-1; j>=0 && t < array[j]; j--,circleCount++,swapCount++) {
array[j+1] = array[j];
}
//插
array[j+1] = t;
}
System.out.println("排序后:");
for (int i : array) {
System.out.println(i);
}
System.out.println(MessageFormat.format("循环{0}次,值交换{1}次,耗时{2}秒",
circleCount,swapCount,(System.currentTimeMillis()-begin)/1000.0));
输出结果为:
从输出结果看,插入排序相较于冒泡排序和选择排序,循环最少,耗时最少,效率更好。