引文:十大经典排序算法
算法即解决问题的方法。
先从一张表认识排序算法:
1. 认识时间复杂度
O(f(n)):用同样曲线类型的函数f(n)来表示这个算法在n不断变大的趋势。
O(1) :运算次数为常数的算法 : (简单赋值操作:temp = a)
O(n) :操作次数和n正比线性增长:
sum=0; //频度: 1
for(i=0;i<n;i++) n
sum++; n
//f(n)=2n+1
O():常见简单算法都是这个
sum=0; //频度: 1
for(i=0;i<n;i++) n
for(j=0;j<n;j++) n^{2}
sum++; n^2
//f(n)= 2n^2 + n +1
2. 几种简单排序算法
1. 冒泡排序(bubble sort)
算法原理:比较相邻元素,如果第一个比第二个大就交换位置。
javascript实现:
function bubbleSort(arr) {
var len = arr.length;
for (var i = 0; i < len - 1; i++) {
for (var j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) { //如果相邻元素,第一个大于第二个
var temp = arr[j+1];
arr[j+1] = arr[j]; // 元素交换
arr[j] = temp;
}
}
}
return arr
}
2.选择排序
算法原理:在未排序序列中寻找最大(小)元素,存放到排序序列的起始位置
JavaScript实现:
function selectSort(arr) {
var len = arr.length;
var minIndex, temp;
for (var i=0; i<len-1; i++) {
minIndex = i; //i之前的为已经排序的数组
for (var j = i+1; j < len; j++) {
if (arr[j] < arr[minIndex]) { //找到数组中未排序元素的最小值
minIndex = j //取得最小元素的索引
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr
}
3. 插入排序
算法原理:将未排序序列在已排序序列中从后向前扫描,找到相应位置插入
JavaScript实现:
function bubbleSort(arr) {
var len = arr.length;
var preIndex, current;
for (var i=0; i<len;i++) { //遍历整个数组
preIndex = i -1;
current = arr[i];
while (preIndex >= 0 && arr[preIndex] > current) { //如果前一个元素比当前元素大
arr[preIndex+1] = arr[preIndex]; //当前元素为两者中较大的那个值
preIndex -- //再往前遍历
}
arr[preIndex+1] = current; //找到最小的值得索引并把当前值赋值
}
return arr
}
4. 希尔排序
算法原理:将整个序列分割成若干子序列,然后分别进行直接插入排序,再对全体进行直接插入排序。
JavaScript实现:
function shellSort(arr) {
var len = arr.length,
temp,
gap = 1;
while(gap < len/3) { //动态定义间隔序列
gap =gap*3+1;
}
for (gap; gap > 0; gap = Math.floor(gap/3)) {
for (var i = gap; i < len; i++) {
temp = arr[i];
for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) {
arr[j+gap] = arr[j];
}
arr[j+gap] = temp;
}
}
return arr;
}