一、插入排序
1、直接插入排序
无序序列逐个插入到有序序列。
function straisort(r,n){// length 为n的数组r
var i,j,x;
for(i = 1;i<n;i++){
x = r[i];
j = i-1;
while(x < r[j]){
r[j+1]=r[j]
j--
}
r[j+1]= x;
}
}
2、希尔排序
分组的基础上进行简单插入排序,降低时间复杂度。
function shellsort(r,n,d,T){// r为待排序数组,n为r的长度,d 为增量序列数组[5,3,1],T为d 的长度。
var i,j,k,x;
k = 0;
while(k<T){
for(i = d[k]-1;i<n;i++){
// i 为未排序记录的位置
x = r[i];
j = i - d[k]// j 为本组i前面记录的位置
while((j>=0)&&x<r[j]){
// 组内简单插入排序
r[j+d[k]] = r[j];
j = j-d[k];
}
r[j + d[k]] = x;
}
k++;
}
}
希尔伯特(hibbard’s)增量序列
h
k
=
2
k
−
1.
h_k = 2^k-1.
hk=2k−1.
平均时间复杂度
T
(
N
)
=
O
(
N
5
/
4
)
.
T(N)=O(N^{5/4}).
T(N)=O(N5/4).
Sedgewick’s 最佳增量序列,目前已知最佳。
h
i
=
9
∗
4
i
−
9
∗
2
i
+
1.
h_i = 9*4^i - 9*2^i +1.
hi=9∗4i−9∗2i+1.
平均时间复杂度
T
(
N
)
=
O
(
N
7
/
6
)
.
T(N)=O(N^{7/6}).
T(N)=O(N7/6).
二、选择排序
1、简单选择排序
无序序列中选择最小(大)的值加入到有序序列。
function smp_seleSort(r,n){
var i,j,k,x;
for(i=0;i<n-1;i++){
k = i;
for(j=i+1;j<=n-1;j++){
if(r[j] < r[k]) k=j;
if(i !== k){
x = r[i];
r[i] = r[k];
r[k] = x;
}
}
}
}
三、交换排序
1、冒泡排序
function bubble_sort(r,n){
var m,j,x;
var flag=1
m = n;
while((m>1)&& flag === 1){
flag = 0;// 本趟是否有交换操作标识初始化
for(j = 1;j < m;j ++){
if(r[j] > r[j+1]){
flag = 1;
x = r[j];
r[j] = r[j+1];
r[j+1] = x;
}
}
m--;
}
}
2、快速排序
分治法思想,选一个枢纽,小的放左边,大的放右边。
function qksort(r = [], t, w){ // t = low, w = high
var i,j,x;
if(t>w){ return;}
i = t;j = w; // i 指针向后移动,j指针向前移动
x = r[i];// 枢纽取第一个
// x = median(r,i,j);//枢纽取三者其中
while(i<j){
while((i<j)&&(r[j]>=x)){// 先移动j,枢纽后面的值,大于枢纽
j --;}
if(i<j){// 不满足时,把j 赋值给 i
r[i] = r[j];i ++; }
while((i<j)&&(r[i]<=x)){// //枢纽前面的值,小于枢纽
i++; }
if(i<j){// 不满足时,把 i 赋值给 j ,j拿到一个较为合适的值
r[j]= r[i]; j--;}
}
r[i] = x;// 把枢纽插回合适位置
qksort(r,t,j-1);
qksort(r,j+1,w);
}