一. 冒泡排序
1.原理:比较两个相邻的元素,将大的交换到右边,如果相等,则不进行交换;
2.过程:
(1)第一次比较:比较第一个数和第二个数,将值大的放在前面,值小的放在后面;
(2)比较第二个数和第三个数,依次类推...;
(3)第一次比较完成,最大的数放到了最后面;
(4)进行第二次比较,最后一个数不参加比较,依次类推进行第三次比较...;
3. 时间复杂度:N个数字要完成排序,要进行总共N-1次排序,每次(第 i 次)排序次数为(N-i)次,用双循环语句,外层控制循环次数,内层控制每一次的循环次数,时间复杂度为O();
4.实现代码:
var arr=[10,5,69,80,19,56,50];
for ( var i=1;i<arr.length;i++){
for (var j=0;j<arr.length;j++) {
if (arr[j] > arr[j+1]) {
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
console.log(arr)
二.插入排序算法
1.原理:将未排序数据,对已排序数据序列从后向前对比扫描,找到对应的位置并插入,在从后向前扫描的过程中,需要反复的把已排序的元素逐步向后挪位,为新插入元素提供插入的位置。
2.过程
(1)第一个元素被认为已被排序;
(2)取出下一个元素,在已经排好序的序列中从后往前对比扫描,如果该元素小于序列中对比的元素;将该元素插入到该位置
(3)不断重复步骤2
3.时间复杂度:外层循环将遍历数组,每次循环决定要“插入”的数,内层循环从第二个元素(第一个进行排序的元素)开始,每次与前一个数进行比较,决定是否插入。时间复杂度是O();
4.实现代码:
var arr=[10,5,69,80,19,56,50];
for (var i=1; i<arr.length;i++){
for (var j=i-1;j>=0;j--){
if (arr[j+1]<arr[j]) {
var temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}else if(arr[j+1]>=arr[j]) {
break;
}
}
}
三.快速排序算法
1.原理:使用分治法策略来把一个序列分为两个子序列。
2.过程:
(1)以数组中的第一个元素为基准元素
(2)所有比基准小的元素放在low数组里,所有比基准大的放在high数组里,相同的可以放到任意一遍
(3)递归把小于基准值元素的子数列和大于基准值元素的子数列排序
(4)最后把数组拼接到一起
3.时间复杂度:O(nlogn)。
4.实现代码
var arr=[10,5,69,80,19,56,50];
function quickSort(arr){
if(arr.length<=1) {
return arr;
}
let lowArr=[];
let highArr=[];
for(let i=1; i<arr.length; i++) {
if(arr[i] >= arr[0]) {
highArr.push(arr[i]);
}else{
lowArr.push(arr[i]);
}
}
return quickSort(lowArr).concat(arr[0]).concat(quickSort(highArr));
}
四.希尔排序
1.原理:简单插入排序的改进版,优先比较距离较远的元素,所以又叫缩小增量排序
2.过程:
(1)选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
(2)按增量序列个数k,对序列进行k 趟排序;
(3)每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
3.时间复杂度:O(nlogn)。
4.实现代码:
var arr=[10,5,69,80,19,56,50];
function shellSort(arr) {
var len=arr.length;
var temp;
var num;
while (num<len/3) { //定义间隔序列
num = num * 3 + 1;
}
for (num; num>0; num=Math.floor(num/3)) {
for (var i=num; i<len; i++) {
temp = arr[i];
for (var j=i-num; j>0 && arr[j]>temp; j-=num) {
arr[j+num] = arr[j];
}
arr[j+num] = temp;
}
}
return arr;
}