- 最近看了一下论坛里的关于排序的博文,感触颇深,但却是描述繁琐,于是便自己写篇简短的心得体会。
插值排序
- 原理简述:通过将一个集合中元素,插入序列中,使之有序
- 过程概述:
- 假设现有一集合{3,1,2,9,6},我们用插值排序实现它的顺序排列:
1) 从后往前比较,首先拿 1 与 3 比较1<3,则把1插入到3前面 ——>此时集合:{1,3,2,9,6}——>前面两位数1,3为有序
2)同样拿 2 依次与3、1比较,插入——>此时集合:{1,2,3,9,6} ——> 集合中形成有序数列:1,2,3
3)同理拿 9 一次与1、2、3比较——>此时集合{1,2,3,9,6} ——> 集合中形成有序数列:1,2,3,9
4)同理拿 6 一次与1、2、3、9比较、插入 ——> 形成顺序排列集合{1,2,3,6,9}
总结(假设一个集合含有N个元素):可得出结果,每次插入动作完成都会形成一组有序的队列,通过最多(N-1)次插入动作,完成排序。
代码实现
- java1.8实现
import java.util.Random;
public class InsertSort {
public static void main(String[] args) {
//随机生成10位不重复数组,元素值1~100
Random rand = new Random();
int size = 0;
int[] arr = new int[10];
arr[size++] = rand.nextInt(100) + 1;//元素值1~100
for (; size < 10; ) {
int num = rand.nextInt(100) + 1;
boolean notEcho = true;
for (int j = 0; j <= size; j++) {
if (num == arr[j]) {
notEcho = false;
break;
}
}
if (notEcho) {
arr[size++] = num;
}
}
System.out.print("排序前:");
for (int i : arr) {
System.out.print(i + "\t");
}
//插值排序实现
boolean goodSort;
//外循环9次,执行9次插入
for (int i = 1; i < arr.length; i++) {
int n = arr[i];
int j = i-1;
for (; j >= 0; j--) { //内循环
//挪
if (n >= arr[j]) {
break;
}
arr[j+1] = arr[j];
}
//插值
arr[j+1] = n;
}
System.out.print("\n排序后:");
for (int i : arr) {
System.out.print(i + "\t");
}
}
}
效果:
- python实现:
import random
arr = random.sample(range(1,100), 10) #生成含十个不同数字的列表
print("排序前:",end="")
print(arr)
#插值排序
for i in range(1,10): # 外循环9次,执行9次插入
n = arr[i]
j = i-1
while j>=0:
if n>=arr[j]:
break;
#挪
arr[j+1] = arr[j]
j-=1
#插值
arr[j+1] = n;
print("排序后:",end="")
print(arr)