插入排序与交换排序
来源:互联网 发布:桌面软件 知乎 编辑:程序博客网 时间: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
- 交换排序与插入排序
- 插入排序与交换排序
- 交换排序、插入排序
- 排序(1)--插入排序和交换排序
- 冒泡排序、插入排序、交换排序
- 内部排序(一)------插入排序、交换排序
- 选择排序,冒泡排序,插入排序,交换排序,shell排序
- 常见排序算法汇总与分析(上)(交换排序与插入排序)
- 交换排序与冒泡排序
- 排序:插入排序/选择排序/交换排序(冒泡法)
- 插入排序、交换排序、选择排序、归并排序、基数排序
- 插入排序/选择排序/交换排序/归并排序/基数排序
- C++排序方法:插入排序、交换排序、选择排序
- 插入排序、选择排序、交换排序和归并排序
- 插入排序:直接插入、交换插入、折半插入
- 排序算法之插入排序和交换排序
- 排序(1)插入排序及交换排序
- 快速排序与插入排序
- Java并发编程:Lock
- java-数组
- Django视图(python函数)
- 专用词汇
- NPM的命令
- 插入排序与交换排序
- Linux下MySQL的数据文件存放在哪里的??
- Latex 双击SumatraPDF无法进入WinEdt对应位置的解决办法
- struts2+Spring服务器启动时Bean实例化失败,报ServletActionContext.getRequest空指针异常
- codeforces 171D Broken checker (多次尝试)
- 行为树(Behavior Tree)实践(1)– 基本概念
- 机器学习之kNN分类算法
- 回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议
- 学习阿里巴巴开发手册-4