十大排序算法——插入排序
特点:
思想
类似打扑克。对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
算法步骤
- 将第一排待排序序列第一个元素看作一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
- 从头到尾依次扫描未排序序列,将扫描到的每个元素插入到有序序列的适当位置(若相等,则将其插入到相等元素之后)。
java代码实现
public static void main(String[] args) {
int[] a = {7, 4, 1, 9, 6, 5, 12, 2, 11, 8, 3, 10};
for(int i=1;i<a.length;i++) {//未排序序列 待插入元素
int temp = a[i];
int j = i-1;
while(j>=0&&temp<a[j]) {//有序序列
a[j+1] = a[j]; //比较,a[j]比temp大,则a[j]往后移一位
j--;
}
a[j+1] = temp;//遇到比temp小的第一个数时||遍历完但a[0]仍然比temp大时
}
System.out.println(Arrays.toString(a));
}
一个更好理解的写法
public static void main(String[] args) {
//从小到大排序
int[] a = {7, 4, 1, 9, 6, 5, 12, 2, 11, 8, 3, 10};
for (int i = 1; i < a.length; i++) {//未排序元素下标
for (int j = i; j > 0; j--) {//要比较的元素的下标
if(a[j-1] < a[j]) break;//前后两两对比,直到前面元素已经小于后面元素(由小到大为例),就可以退出
swap(a, j-1,j);//否则,前后两元素交换
}
}
System.out.println(Arrays.toString(a));
}
private static void swap(int[] a, int i, int j) {
a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j];
a[i] = a[i] ^ a[j];
}
scala代码实现
def main(args: Array[String]): Unit = {
val a = Array[Int](7, 4, 1, 9, 6, 5, 12, 2, 11, 8, 3, 10)
for(i <- 1 until a.length){
breakable(
for(j <- 1 to i reverse){
if(a(j-1) < a(j)) break
swap(a, j-1, j)
}
)
}
println(a.mkString(","))
}
def swap(a: Array[Int], i: Int, j: Int) = {
a(i) = a(i) ^ a(j)
a(j) = a(i) ^ a(j)
a(i) = a(i) ^ a(j)
}
优化
拆半查找