这是第一次算法课的实验,按照老师的规定写代码
先理解插入排序的排序原理:把n个待排序的元素看成为一个有序表和一个无序表。
开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,
将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程
- 算法步骤:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到该位置后重复步骤2~4
//声明的变量
private double[] arrTest;
private int count; //记录比较的次数
private int len;
//---------------------------------------------------------------
//插入排序函数
public void Rank() {
for(int i = 1; i<arrTest.length; i++ ) {
double temp = arrTest[i];
int leftIndex = 0;
boolean flag1 = false;//flag2 = false;
//temp比前一个数大就停下来,temp比前一个数小就继续比较
for(leftIndex =i-1;leftIndex>=0 && temp<arrTest[leftIndex];--leftIndex) {
arrTest[leftIndex+1] = arrTest[leftIndex];
count++;
if(leftIndex==0) {
flag1 = true;
}
}
//比较了1次但是没有进入循环体
if(flag1==false) {
count++;
}
//if(flag1==false && flag2 == true) {
//count++;
//}
arrTest[leftIndex+1] = temp;//寻找到自己的位置
}
}
本实验需要计数,我通过设置一个标准位来判断是否比较了,
假设数组的序列为:1 3 2
temp=1,flag1 = false, 首先3与temp比较,3>temp比前一个数大,不进入循环体,flag为false
但是比较了一次count要 +1 ,然后进入下一轮比较 temp=3,flag1=false, 首先2与3比较,2<3,进入
循环体,交换元素,count+1,但是当前的下标不是0(如果为0,再次循环判断时会跳出循环体,但是并没有比较,不需要加一,
所以需要设置flag为true来避免多加一次1)