插入排序与交换排序

来源:互联网 发布:桌面软件 知乎 编辑:程序博客网 时间:2024/06/03 12:28

1.插入排序

插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。

a. 直接插入排序
其基本操作是将一条记录插入到已排好序的有序表中,从而得到一个新的、记录数量增一的有序表。
算法时间复杂度O(n^2),算法简便稳定,适用于链式存储、顺序存储。代码实现如下:

function insertSort () {    var arr=arguments;    for(var i=1;i<arr.length;i++){        if(arr[i]<arr[i-1]){            var temp=arr[i];  //临时存储待插入的值            arr[i]=arr[i-1];  //将arr[i-1]后移            for(var j=i-2;arr[j]>temp;j--){//从后向前寻找插入位置                arr[j+1]=arr[j];//记录逐个后移,直到找到插入位置            }            arr[j+1]=temp;//将temp即原arr[i]插入到正确位置        }    }    console.log(arr);}insertSort(3, 23, 66, 32, 2, 77, 45, 87, 64, 34, 33);

b. 折半插入排序
算法时间复杂度O(n^2),算法稳定,适用于顺序存储。代码实现如下:

function BinsertSort () {    var arr=arguments;    for(var i=1;i<arr.length;i++){        var temp=arr[i];  //临时存储待插入的值        var low=0;              var high=i-1;        while(low<=high){  //在[low,high]中折半查找插入的位置            var mid=parseInt((low+high)/2);             if(temp<arr[mid]){  //插入点在前一位置                high=mid-1;            }else{  //插入点在后一位置                low=mid+1;            }                   }        for(var j=i-1;j>=high+1;j--){            arr[j+1]=arr[j]; //记录后移        }        arr[high+1]=temp;  //将temp即原arr[i]插入到正确位置    }    console.log(arr);}BinsertSort(23, 3, 66, 32, 2, 77, 45, 87, 64, 34, 33);

2.交换排序

其基本思想是:两两比较待排序记录的关键字,当发现两个记录不满足次序要求时就进行交换,直到整个序列满足要求为止。

a. 冒泡排序
其通过两两比较相邻记录的关键字,如果发生逆序,就进行交换,从而使关键字小的记录如气泡一般往上浮,或使关键字大的记录如石块一般往下沉。
算法时间复杂度O(n^2),算法稳定,适用于链式存储、顺序存储。代码实现如下(本代码是使关键字小的上浮):

//升序var result = [12, 8, 4, 38, 79, 87];for(var i = 0; i < result.length; i++) {    for(var j = i + 1; j < result.length; j++) {        if(result[i] > result[j]) {            var temp = result[i];            result[i] = result[j];            result[j] = temp;        }    }}

b. 快速排序
其基本思想是:在待排序的n个记录中任取一个作为枢纽key。经过一次排序后把所有关键字小于key的交换到前面,大于key的交换到后面,结果将待排序记录分成两个子表,最后将key放在分界处的位置。后分别对左右子表重复上述过程,直至每一个子表只有一个记录时,排序完成。
算法时间复杂度O(nlog2(n)),算法不稳定,适用于顺序存储。代码实现如下:

function quick_sort(arr, low, high) {    if (low < high) {        var i = low;        var j = high        var flag = arr[i];        while (i < j) {            while (i < j && arr[j] >= flag) {                j--;            }            if (arr[j] < flag) {                arr[i] = arr[j];            }            while (i < j && arr[i] <= flag) {                i++;            }            if (arr[i] > flag) {                arr[j] = arr[i];            }        }        arr[i] = flag;        quick_sort(arr, low, i - 1);        quick_sort(arr, i + 1, high)    }}var arr = [3, 23, 66, 32, 2, 77, 45, 87, 64, 34, 33];quick_sort(arr, 0, 10);console.log(arr);
阅读全文
1 0
原创粉丝点击