let temp;let arrays =[1,5,3,2,6,9,8,4,1,2,3,6,5,4,7,8,5,1,2,3,6,4,8]let str =''for(let i =1; i <10000; i++){
arrays.push(Math.floor(Math.random()*10000))}
console.log(newDate().getTime());//外层循环控制需要排序的趟数(从1开始因为将第0位看成了有序数据)for(let i =1; i < arrays.length; i++){
temp = arrays[i];//如果前一位(已排序的数据)比当前数据要大,那么就进入循环比较[参考第二趟排序]while(i >=1&& arrays[i -1]> temp){//往后退一个位置,让当前数据与之前前位进行比较
arrays[i]= arrays[i -1];//不断往前,直到退出循环
i--;}//退出了循环说明找到了合适的位置了,将当前数据插入合适的位置中
arrays[i]= temp;}
console.log(newDate().getTime());
voidInsertSortArray(){for(int i =1; i < n; i++)//循环从第二个数组元素开始,因为arr[0]作为最初已排序部分 {int temp = arr[i];//temp标记为未排序第一个元素 int j = i -1;while(j >=0&& arr[j]> temp)/*将temp与已排序元素从小到大比较,寻找temp应插入的位置*/{
arr[j +1]= arr[j];
j--;}
arr[j +1]= temp;}}
(三)归并排序(Merge Sort)
核心思想:
把长度为n的输入序列分成两个长度为n/2的子序列;
对这两个子序列分别采用归并排序;
将两个排序好的子序列合并成一个最终的排序序列。
时间复杂度: O(nlog2n)
空间复杂度: O(1)
算法分析: 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。它是一种稳定的排序方法。和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(nlogn)的时间复杂度。代价是需要额外的内存空间。
voidMergeSort(int low,int high){if(low >= high)return;//每个子列表中剩下一个元素时停止 elseint mid =(low + high)/2;/*将列表划分成相等的两个子列表,若有奇数个元素,则在左边子列表大于右侧子列表*/MergeSort(low, mid);//子列表进一步划分 MergeSort(mid +1, high);int[] B =newint[high - low +1];//新建一个数组,用于存放归并的元素 for(int i = low, j = mid +1, k = low; i <= mid && j <= high; k++)/*两个子列表进行排序归并,直到两个子列表中的一个结束*/{if(arr[i]<= arr[j];){
B[k]= arr[i];
I++;}else{
B[k]= arr[j];
j++;}}for(; j <= high; j++, k++)//如果第二个子列表中仍然有元素,则追加到新列表
B[k]= arr[j];for(; i <= mid; i++, k++)//如果在第一个子列表中仍然有元素,则追加到新列表中
B[k]= arr[i];for(int z =0; z < high - low +1; z++)//将排序的数组B的 所有元素复制到原始数组arr中
arr[z]= B[z];}
var len;// 因为声明的多个函数都需要数据长度,所以把len设置成为全局变量
function buildMaxHeap(arr){// 建立大顶堆
len = arr.length;for(var i = Math.floor(len/2); i >=0; i--){heapify(arr, i);}}
function heapify(arr, i){// 堆调整var left =2* i +1,
right =2* i +2,
largest = i;if(left < len && arr[left]> arr[largest]){
largest = left;}if(right < len && arr[right]> arr[largest]){
largest = right;}if(largest != i){swap(arr, i, largest);heapify(arr, largest);}}
function swap(arr, i, j){var temp = arr[i];
arr[i]= arr[j];
arr[j]= temp;}
function heapSort(arr){buildMaxHeap(arr);for(var i = arr.length -1; i >0; i--){swap(arr,0, i);
len--;heapify(arr,0);}return arr;}