冒泡排序
基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
最简单排序实现
function simpleSort(arr) {
for(var i = 0; i < arr.length; i++) {
for(var j = i+1; j < arr.length; j++) {
if(arr[i] > arr[j]) {
swap(arr, i ,j);
}
}
}
}
function swap(arr, i, j) {
var save = arr[j];
arr[j] = arr[i];
arr[i] = save;
}
冒泡排序
// 第一种写法,把最大值压在右边,不用再处理右边
function bubleSort(arr) {
for(var i = 0 ; i < arr.length; i++) { //需要对比几轮
for(var j = 0; j < arr.length-i-1; j++) { //此轮需要对比几次,向前换
if(arr[j] > arr[j+1]) {
swap(arr, j, j+1);
}
}
}
}
// 第二种写法,把最小值压在左边,不用再处理左边
function bubleSort(arr) {
for(var i = 0 ; i < arr.length; i++) { //需要对比几轮
for(var j = arr.length-2; j >= i; j--) { //此轮需要对比几次,向后换
if(arr[j] > arr[j+1]) {
swap(arr, j, j+1);
}
}
}
}
改进的冒泡排序
function bubleSort(arr) {
var flag = true;
for(var i = 0 ; i < arr.length && flag; i++) { //需要对比几轮
flag = false;
for(var j = 0; j < arr.length-i-1; j++) { //此轮需要对比几次,向前换
if(arr[j] > arr[j+1]) {
swap(arr, j, j+1);
flag = true;
}
}
}
}
function bubleSort(arr) {
var flag = true;
for(var i = 0 ; i < arr.length && flag; i++) { //需要对比几轮
flag = false;
for(var j = arr.length-2; j >= i; j--) { //此轮需要对比几次,向后换
if(arr[j] > arr[j+1]) {
swap(arr, j, j+1);
flag = true;
}
}
}
}
在有一轮没有数据进行交换的时候,将表明后序的轮次不会再数据交换,不必再循环了
时间复杂度分析
未改进的时候:
最好和最坏情况的复杂度:O(n^2)
改进后:
最好情况的复杂度:O(n)
最坏情况的复杂度:O(n^2)