直接插入排序
<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>