使用了JavaScript语言,可直接按f12,在浏览器控制台运行
直接插入排序:
function insertionSort(arr) {
for (let i = 1; i < arr.length; i++) { //在arr[0,...,i-1]中插入arr[i]
const toInsertValue = arr[i];/*比较目标*/
let j;
for (j = i-1; j >=0 && arr[j] > toInsertValue; j--) {/*j-1到0比较*/
arr[j+1] = arr[j];
}
arr[j+1] = toInsertValue;
//arr[j] = toInsertValue;一个符号能够将一个程序全弄错
//内循环结束得到的arr[j-1]是第一个比arr[i]小的值,那么就把arr[i]存储在此处的arr[j]上。而之前的arr[j]已经在上一轮循环中存储到了arr[j+1]中
}
}
var a=[1111,102,44,33];insertionSort(a);console.log(a)
希尔排序:(跨间隔比较)
希尔排序和直接插入排序一样,只不过是将1换成了d
shell 以531增量为例,算法是 达成增量有序的 使得序列基本有序 以插入
function shell_pass(arr) {
var d=5;
for (let i = d; i < arr.length; i++) { //在arr[0,...,i-1]中插入arr[d]
const toInsertValue = arr[i];
let j;/* */
for (j = i-d; j >0 && arr[j] > toInsertValue; j-=d) {/*j-1到0比较*/
arr[j+d] = arr[j];
}
arr[j+d] = toInsertValue;
//arr[j] < toInsertValue 前小于后,直接对后边的赋值
}
}
var a=[9,13,8,2,5,13,7,1,15,11];
shell_pass(a);
console.log(a)
function shell_pass(arr,d) {
for (let i = d; i < arr.length; i++) { //在arr[0,...,i-1]中插入arr[d]
const toInsertValue = arr[i];/*插入目标-哨兵*/
let j;/* */
for (j = i-d; j >=0 && arr[j] > toInsertValue; j-=d) {/*j-1到0比较*/
arr[j+d] = arr[j];
}
arr[j+d] = toInsertValue;
//arr[j] < toInsertValue 前小于后,直接对后边的赋值
}
}
var d=[5,3,1];/*增量序列*/
var a=[9,13,8,2,5,13,7,1,15,11];shell_pass(a,d[2]);console.log(a);shell_pass(a,d[1]);console.log(a);
哨兵a[0]:
引入哨兵的好处:
不需要增加额外空间,保存当前待插入记录(不会因记录的后移而被占用)。
可以保证在内循环的由后向前的移动中,总可以在超出循环边界前找到一个等于当前的记录,起**“哨兵”**监视作用
function insertionSort(arr) {
for (let i = 2; i <arr.length; i++) { //在arr[1,...,i-1]中插入arr[i]
arr[0] = arr[i];/*设置哨兵*/
let j;
for (j = i-1; arr[j] > arr[0]; j--) {
arr[j+1] = arr[j];
}
arr[j+1] = arr[0];
}
}
var a=[0,1111,102,44,33];
insertionSort(a);
console.log(a)
直接插入排序C语言版(希尔排序将1换成参数即可):
void insertionSort(int arr[]){
for(int j=1;j<4;j++){
int temp=arr[j];
for(int k=j-1;k>=0;k--){
if(arr[k]>temp)arr[k+1]=arr[k];
else{arr[k+1]=temp; break;}
}
}
printf("加油");
}