直接插入排序
<script>
var arr=[33,12,3,2,1,0,67]; //待排序的数组
function sortArr(curArr){
//为了便于排序,将待排序的数组copy一份,第0个位置用来放岗哨元素,为了辅助排序
var newArr=[];//为了实现插入排序的辅助数组
var resultArr=[];//存排好序的元素
for(var i=0;i<curArr.length;i++){
newArr[i+1]=curArr[i];
}
//下面为直接插入排序的算法开始
for(var i=2;i<newArr.length;i++){
if(newArr[i]<newArr[i-1]){//为了优化算法,避免当关键字curArr[i]已是当前最大的记录关键字时还要进行不必要的操作
//当第i个元素小于第i-1个元素时,意味着要进行插入排序
newArr[0]=newArr[i];//因为后面要进行移位,所以先保存第i个元素(即:监视哨备份待查记录)
for(var j=i-1;newArr[0]<newArr[j];j--){
newArr[j+1]=newArr[j];
newArr[j]=newArr[0];
}
}
}
//直接插入排序算法结束
//因为newArr的第0个元素为辅助排序的,为了输出美观,又对newArr数组进行了一次复制
for(var i=1;i<newArr.length;i++){
resultArr[i-1]=newArr[i];
}
return resultArr;
}
var reArr=sortArr(arr);
console.log('原来的数组'+arr.join(','));
console.log('排序后的数组'+reArr.join(','));
</script>
折半插入排序
<script>
var arr=[33,12,3,2,1,0,67,98,12]; //待排序的数组
function sortArr(curArr){
//为了便于排序,将待排序的数组copy一份,第0个位置用来放岗哨元素,为了辅助排序
var newArr=[];//为了实现插入排序的辅助数组
var resultArr=[];//存排好序的元素
var low;//查找区间的下界
var high;//查找区间的上界
var mid;//查找区间的中间位置
for(var i=0;i<curArr.length;i++){
newArr[i+1]=curArr[i];
}
//下面为折半插入的算法开始
for(var i=2;i<newArr.length;i++){
if(newArr[i]<newArr[i-1]){
//需要进行移位
newArr[0]=newArr[i];//监视哨备份待查记录
low=1;
high=i-1;
//下面为折半查找第i个元素的插入位置
while(low<=high){
mid=Math.floor((high+low)/2);//确定待查找范围的中间位置
if(newArr[0]<newArr[mid]){
//当待查找元素在表的前半部分时
high=mid-1;
}else{
//当待查找元素在表的后半部分时
low=mid+1;
}
}
//将第i个元素放在已经查找到的那个位置上
for(var j=i-1;j>=low;j--){
newArr[j+1]=newArr[j];//记录后移
}
newArr[low]=newArr[0]; //插入到正确的位置
}
}
//折半插入算法结束
//因为newArr的第0个元素为辅助排序的,为了输出美观,又对newArr数组进行了一次复制
for(var i=1;i<newArr.length;i++){
resultArr[i-1]=newArr[i];
}
return resultArr;
}
var reArr=sortArr(arr);
console.log('原来的数组'+arr.join(','));
console.log('排序后的数组'+reArr.join(','));
</script>
冒泡排序
<script>
var arr=[33,12,3,2,1,0,67,98,6]; //待排序的数组
console.log('原来的数组'+arr.join(','));
function sortArr(curArr){
//下面为冒泡排序的算法开始
var flag=true;//用来标志是否要进行交换操作
for(var i=0;i<curArr.length-1&&flag;i++){
flag=false;
for(var j=0;j<curArr.length-i;j++){
if(curArr[j]>curArr[j+1]){
//为逆序,则需要交换
var t=curArr[j+1];
curArr[j+1]=curArr[j];
curArr[j]=t;
flag=true;
}
}
}
//冒泡排序算法结束
return curArr;
}
var reArr=sortArr(arr);
console.log('排序后的数组'+reArr.join(','));
</script>
简单选择排序
<script>
var arr=[33,12,3,5,2,0,67,98,6]; //待排序的数组
console.log('原来的数组'+arr.join(','));
function sortArr(curArr){
//下面为简单选择排序的算法开始
for(var i=0;i<curArr.length-1;i++){
var k=i;//假设当前项为最小的,记录其下标
for(var j=i+1;j<curArr.length;j++){
if(curArr[k]>curArr[j]){
//当逆序时需要交换
k=j;//更新最小项的下标
}
}
if(k!=i){
//意味着需要进行交换
var t=curArr[i];
curArr[i]=curArr[k];
curArr[k]=t;
}
}
//简单选择排序算法结束
return curArr;
}
var reArr=sortArr(arr);
console.log('排序后的数组'+reArr.join(','));
</script>