冒泡排序
////////////////////////////////////////////////////////////////
// bubble sort
function ArrayList(){
// 私有变量
var arr = [];
// 将数组中i,j位置的数组进行交换
var swap = function(i, j){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// add element
this.insert = function(item) {
arr.push(item);
}
// to string
this.toString = function(){
// 数组中的join() 方法默认是按照 "," 进行分割的
return arr.join();
}
// v1 : bubble sort(注意:i, j两个变量都是从0开始的)
this.bubbleSort = function(){
var len = arr.length;
for (var i = 0; i < len; i++) {
// 内层循环从第一位一直迭代到倒数第二位
for (var j = 0; j < len - i; j++) {
// 只要前面的元素比后面的元素大的话,就去直接交换
if (arr[j] > arr[j + 1]) {
swap(j, j + 1);
}
}
}
}
// v2 : 从内循环减去外循环已经跑过的轮数,可以避免循环中所有不必要的比较
this.bubbleSort = function (){
var len = arr.length;
for (var i = 0; i < len; i++) {
for (var j = 0; j < len - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(j, j + 1);
}
}
}
}
}3
/*
* 创建一个无序数组
* @ size
* */
function createNoneSortedArray(size){
var arr = new ArrayList();
for (var i = size; i > 0; i--) {
// 直接给数组初始化一个逆序的数组序列
arr.insert(i);
}
return arr;
}
///////////////////////////////////////////////////////////////////////
// 测试
var arr = createNoneSortedArray(5);
console.log(arr, arr.toString());
// bubble sort
arr.bubbleSort();
console.log(arr.toString());
插入排序
//////////////////////////////////////////////////////////////////////////////////////
// insert sort
function ArrayList(){
var arr = [];
var swap = function(i, j){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
this.insert = function (item){
arr.push(item);
}
this.toString = function(){
return arr.join();
}
// v1 : insert sort
this.insertSort = function(){
var len = arr.length;
// 每次直接从当前元素前面的元素进行比较交换
// 假设用户的手中刚开始的时候已经有了一张扑克牌了
for (var i = 1; i < len; i++) {
for (var j = i; j > 0; j--) {
if (arr[j - 1] > arr[j]) {
swap(j - 1, j);
}/* else {
break;
}*/
}
}
}
// v2 : 不使用swap函数进行交换,直接使用原地交换的方式进行排序
this.insertSort = function(){
var len = arr.length;
for (var i = 1; i < len; i++) {
// 1. 先把当前的元素缓存起来
var e = arr[i];
// 2. 保存当前元素e应该插入到的位置j
var j;
// 注意点:
// 1. 插入排序的内层循环必须和这个元素e进行比较,而不是和前面的元素进行比较
// 2. 比较大小的代码必须放在这个内层for循环之内进行比较
for (j = i; j > 0 && arr[j - 1] > e; j--) {
arr[j] = arr[j - 1];
}
// 3. 执行完毕内层循环之后,j的位置已经是当前的目标插入位置了
arr[j] = e;
}
}
}
function createNoneSortArray(size){
var arr = new ArrayList();
for (var i = size; i > 0; i--) {
arr.insert(i);
}
return arr;
}
///////////////////////////////////////////////////////////////////////////////
// 测试
var arr = createNoneSortArray(5);
console.log(arr.toString());
arr.insertSort();
console.log(arr.toString());
选择排序
//////////////////////////////////////////////////////////////////////////////////////
// select sort
function ArrayList(){
var arr = [];
var swap = function(i, j){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
this.insert = function (item){
arr.push(item);
}
this.toString = function(){
return arr.join()
}
// select sort
this.selectSort = function(){
var len = arr.length;
for (var i = 0; i < len; i++) {
var minIndex = i;
// 每次从当前位置以后的元素选择一个最小的元素放在第i个位置上面
for (var j = i; j < len; j++) {
if (arr[j] < arr[i]) {
minIndex = j;
}
}
// 如果当前位置和原始的最小值的标定下标是一样的话,就不处理
if (i !== minIndex)
swap(i, minIndex);
}
}
}
// 创建一个无序数组序列
function createNoneSortArray(size){
var arr = new ArrayList();
for (var i = size; i > 0; i--) {
arr.insert(i);
}
return arr;
}
///////////////////////////////////////////////////////////////////////////////////////
// 测试
var arr = createNoneSortArray(5);
console.log(arr.toString());
arr.selectSort();
console.log(arr.toString());
归并排序
//////////////////////////////////////////////////////////////////////////////////////
// merge sort
function ArrayList(){
var arr = []
var swap = function(i, j){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
this.insert = function (item){
arr.push(item);
}
this.toString = function (){
return arr.join();
}
////////////////////////////////////////////////////////////////////
// merge sort 辅助函数
// 开始对区间[l, middle], [middle + 1, r]区间的元素进行归并
var __merge = function(arr, l, middle, r){
console.log('merge aray start : ', arr, l, middle, r);
// 1. 开辟一个临时空间,把原始的数组复制到这个新的数组里面
// 数组深度克隆: arr.slice(), arr.concat(), for循环, fo (var item in arr)循环
var aux = arr.concat();
for (var i = l; i <= r; i++) {
aux[i - l] = arr[i];
console.log('copy ', arr[i], aux[i], i, r);
}
console.log('aux array now is ', aux, arr);
// 2. 开始进行归并(i, j位置的初始化)
var i = l, j = middle + 1;
for (var k = l; k <= r; k++) {
// 这里需要进行越界的检查啊
if (i > middle) {
// 开始去处理右边的
arr[k] = aux[j - l];
j++;
} else if (j > r) {
arr[k] = aux[i - l];
i++;
}
// 遍历[l, r]区间内的元素(开始依次比较左右区间内的元素的大小,找出一个最小值, 放在第k个位置)
else if (aux[i - l] < aux[j - l]) {
arr[k] = aux[i - l];
i++;
} else {
arr[k] = aux[j - l];
j++;
}
}
}
// 递归使用归并排序算法对arr[l, r]这个区间范围内的数据进行排序
var __mergeSort = function(arr, l, r){
console.log('sort ……', l, r);
// 1. 递归终止条件(l必须始终大于r的)
if (l >= r)
return ;
// 2. 计算数组中间的位置
var middle = Math.floor(l + (r - l) / 2);
console.log('middle now is ', middle);
// 2. 开始对左边的区间元素进行归并排序[l, middle]
__mergeSort(arr, l, middle);
// 3. 开始对右边的区间元素进行归并排序[middle + 1, r]
__mergeSort(arr, middle + 1, r);
console.log('loading……', l, r, middle);
// 4. 排序完成之后,开始进行归并
__merge(arr, l, middle, r);
return arr;
}
// v1 : merge sort
this.mergeSort = function(){
// 对区间[0, n - 1]的元素进行归并排序
arr = __mergeSort(arr, 0, arr.length - 1); // 将数组中的数据修改为最新的数据信息
return arr;
}
}
function createNoneSortArray(size){
var arr = new ArrayList();
for (var i = size; i > 0; i--) {
arr.insert(i);
}
return arr;
}
///////////////////////////////////////////////////////////////////////////////////////
// 测试
var arr = createNoneSortArray(5);
console.log('init array : ', arr.toString());
arr.mergeSort();
console.log('caculate result : ', arr.toString());
快速排序
//////////////////////////////////////////////////////////////////////////////////////
// quick sort
function ArrayList(){
var arr = [];
var swap = function(i, j){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
this.insert = function (item){
arr.push(item);
}
this.toString = function (){
return arr.join();
}
///////////////////////////////////////////////////////////////////////////////////////
// quick sort
// 求出数组arr在区间[l, r]范围的下标p位置,使得p满足条件, arr[l , p - 1] < arr[p], arr[p + 1, r] > arr[p]
var __partition = function(arr, l, r){
// 1. 选择数组中的第一个元素作为标定点
var v = arr[l];
// 2. 初始化变量的初始位置, arr[l + 1, i] < v, arr[j, r] >= v
var i = l + 1, j = r;
// 3. 开始循环
while (true) {
// i 向后移动
while (i <= r && arr[i] < v){
i++;
}
// j 向前移动
while (j >= l && arr[j] > v) {
j--;
}
// 交换数据之前需要先来处理一下元素的条件
if (i > j) {
break;
}
// 此处说明遇到了第一个arr[i] > v && arr[j] < v的元素,直接交换即可
swap(i, j);
// 交换完毕之后,开始进入下一个循环
i++;
j--;
}
// 执行完毕之后,将v元素放在正确的位置
swap(l, j);
// 最终j的位置就是标定点的位置
return j;
}
// 实现对区间arr[l, r] 范围内的元素使用快速排序
var __quickSort = function(arr, l, r){
// 1. 递归终止的条件
if (l >= r) {
return;
}
// 2. 开始求出p的位置,使得数组满足条件arr[l, p - 1] < arr[p], arr[p + 1, r] > arr[p]
var p = __partition(arr, l, r);
// 3. 继续对arr[l, p - 1], arr[p + 1, r]区间的元素使用快速排序
__quickSort(arr, l, p - 1);
__quickSort(arr, p + 1, r);
}
this.quickSort = function(){
// 使用递归实现快速排序
__quickSort(arr, 0, arr.length - 1);
}
function quickSort(arr) {
__quickSort(arr, 0, arr.length - 1)
}
function __quickSort(arr, l, r) {
if (l >= r) {
return;
}
let p = __partition(arr, l, r);
__quickSort(arr, l, p - 1);
__quickSort(arr, P + 1, r)
}
function __partition() {
let v = arr[l];
let i = l + 1, j = r;
while (true) {
while ()
}
}
}
function createNoneSortArray(size){
var arr = new ArrayList();
for (var i = size; i > 0; i--) {
arr.insert(i);
}
return arr;
}
//////////////////////////////////////////////////////////////////////////////////
// 测试
var arr = createNoneSortArray(5);
console.log(arr.toString());
arr.quickSort();
console.log(arr.toString());