码迷,mamicode.com
首页 > 编程语言 > 详细

js排序介绍

时间:2015-10-15 20:25:44      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

排序学习总结

1.冒泡法

总结:第一种冒泡方法:第一个位置的数字和后面相连位置的数字比较。只要后面位置的数字更小,就进行数据交换,再第二个位置数字和其后面相连位置的数字比较,只要后面位置的数字更大,就进行数据交换。依次比较到最后一个数字。

原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |

 

第一趟排序(外循环)

第一次两两比较6 > 2交换(内循环)

交换前状态| 6 | 2 | 4 | 1 | 5 | 9 |

交换后状态| 2 | 6 | 4 | 1 | 5 | 9 |

 

第二次两两比较,6 > 4交换

交换前状态| 2 | 6 | 4 | 1 | 5 | 9 |

交换后状态| 2 | 4 | 6 | 1 | 5 | 9 |

 

第三次两两比较,6 > 1交换

交换前状态| 2 | 4 | 6 | 1 | 5 | 9 |

交换后状态| 2 | 4 | 1 | 6 | 5 | 9 |

 

第四次两两比较,6 > 5交换

交换前状态| 2 | 4 | 1 | 6 | 5 | 9 |

交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

 

第五次两两比较,6 < 9不交换

交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |

交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

 

第二趟排序(外循环)

第一次两两比较2 < 4不交换

交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |

交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

 

第二次两两比较,4 > 1交换

交换前状态| 2 | 4 | 1 | 5 | 6 | 9 | 
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

 

第三次两两比较,4 < 5不交换

交换前状态| 2 | 1 | 4 | 5 | 6 | 9 | 
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

 

第四次两两比较,5 < 6不交换

交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |

交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

 

第三趟排序(外循环)

第一次两两比较2 > 1交换

交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

 

第二次两两比较,2 < 4不交换

交换后状态| 1 | 2 | 4 | 5 | 6 | 9 | 
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

 

第三次两两比较,4 < 5不交换

交换后状态| 1 | 2 | 4 | 5 | 6 | 9 | 
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

 

第四趟排序(外循环)无交换

第五趟排序(外循环)无交换

 

排序完毕,输出最终结果1 2 4 5 6 9

 function(array) {    var i = 0,    len = array.length,    j, d;    for (; i < len; i++) {        for (j = 0; j < len-i; j++) {            if (array[j] > array[j+1]) {                d = array[j];                array[j] = array[i];                array[i] = d;            }        }    }    return array;}

2.选择排序

总结:首先假设第一个数字是最小值,记录下最小值和最小值的下标。第一个位置的数字和后面所有的数字依次比较。只要后面位置的数字更小,就进行数据交换。所以每一趟外循环后,第一个数字一定是余下数字的最小值。

原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |

 

第一趟排序(外循环)

第一次两两比较6 > 2交换(内循环)

交换前状态| 6 | 2 | 4 | 1 | 5 | 9 |

交换后状态| 2 | 6 | 4 | 1 | 5 | 9 |

 

第二次两两比较,2< 4不交换

交换前状态| 2 | 6 | 4 | 1 | 5 | 9 |

交换后状态2 | 6 | 4 | 1 | 5 | 9 |

 

第三次两两比较,2> 1交换

交换前状态2 | 6 | 4 | 1 | 5 | 9 |

交换后状态1| 6 | 4 | 2 | 5 | 9 |

 

第四次两两比较,不交换

 

第五次两两比较,不交换

第二趟排序(外循环)

第一次两两比较6 > 4交换

交换前状态1 | 6 | 4 | 2 | 5 | 9 |

交换后状态1 | 4 | 6 | 2 | 5 | 9 |

 

第二次两两比较,4 > 2交换

交换前状态1 | 4 | 6 | 2 | 5 | 9 |
交换后状态1 | 2 | 6 | 4 | 5 | 9 |

 

第三次两两比较,不交换

 

第四次两两比较,不交换

 

第三趟排序(外循环)

第一次两两比较6 > 4交换

交换后状态1 | 2 | 6 | 4 | 5 | 9 |

交换后状态1 | 2 | 4 | 6 | 5 | 9 |

 

第二次两两比较,不交换

第三次两两比较,不交换

 

第四趟排序(外循环)

第一次两两比较6 > 4交换

交换后状态1 | 2 | 4 | 6 | 5 | 9 |

交换后状态1 | 2 | 4 | 5 | 6 | 9 |

 

第二次两两比较,不交换

 

第五趟排序(外循环)无交换

 

排序完毕,输出最终结果1 2 4 5 6 9

 

 function(array) {    var i = 0,    len = array.length,    j, d;    for (; i < len; i++) {        for (j = i+1; j < len; j++) {            if (array[i] >array[j]) {                d = array[j];                array[j] = array[i];                array[i] = d;            }        }    }    return array;}

注:一开始我把冒泡排序与选择排序混淆了。

3.快速排序

总结:假设要排序的数组是A[0]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为快速排序。快速排序的算法是: 
1)设置两个变量I、J,排序开始的时候I:=0,J:=N;
2)以第一个数组元素作为关键数据,赋值给X,即X:=A[0];
3)从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换; 
4)从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;
5)重复第3、4步,直到I=J; 

注:关键数据时不变的。

// 快速排序 function(array) {    //var array = [8,4,6,2,7,9,3,5,74,5];    //var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];    var i = 0;    var j = array.length - 1;    var Sort = function(i, j) {        // 结束条件        if (i == j) {            return        };        var key = array[i];        var stepi = i; // 记录开始位置        var stepj = j; // 记录结束位置        while (j > i) {            // j <<-------------- 向前查找            if (array[j] >= key) {                j--;            } else {                array[i] = array[j];                //i++ ------------>>向后查找                while (j > ++i) {                    if (array[i] > key) {                        array[j] = array[i];                        break;                    }                }            }        }        // 如果第一个取出的 key 是最小的数        if (stepi == i) {            Sort(++i, stepj);            return;        }        // 最后一个空位留给 key        array[i] = key;        // 递归

        Sort(stepi, i);        Sort(j, stepj);    }    Sort(i, j);    return array;},

4.插入排序

总结:1.取关键数据:一开始取数组中第二个数作为关键数据,后面取第三个数据为关键数据,以此类推直到取到最后一个数据返回数组。2比较方法:把关键数据和前面第一个数据比较,如果这个数据大于关键数据数据,就把这个数据数据赋值给关键数据所在数组位置。再把关键数据和前面第二个数据比较,如果这个数据大于关键数据,就把这个数据赋值给其后一个数据所在数组位置。以此类推。最后把关键数据插入最后一个比它大的数据位置。

例子:

    //插入排序

        static void insertion_sort(int[] unsorted)

        {

            for (int i = 1; i < unsorted.Length; i++)

            {

                if (unsorted[i - 1] > unsorted[i])

                {

                    int temp = unsorted[i];

                    int j = i;

             //如果前面的数据大于后面的数据,就交换位置

                    while (j > 0 && unsorted[j - 1] > temp)

                    {

                        unsorted[j] = unsorted[j - 1];

                        j--;

                    }

                    unsorted[j] = temp;

                }

            }

        }

        static void Main(string[] args)

        {

            int[] x = { 6, 2, 4, 1, 5, 9 };

            insertion_sort(x);

            foreach (var item in x)

            {

                if (item > 0)

                    Console.WriteLine(item + ",");

            }

            Console.ReadLine();

        }

5.希尔排序

总结:希尔排序的步骤:1.选取增量。2.根据增量虚拟分成若干数组,各数组间进行插入排序。3.增量选取会逐步减小,直到最后一个增量是1,在进行插入排序。排序完后希尔排序就完成。

注:1.最后一个增量必须是1。2.用该避免选取增量(尤其是相连的值)互为倍数的情况。

例子:

        static void shell_sort(int[] unsorted, int len)

        {

            int group, i, j, temp;

             //group是选取的增量,从中间开始选取。

            for (group = len / 2; group > 0; group /= 2)            {

            //虚拟分组进行插入排序。                        

                for (i = group; i < len; i++)

                {

                    for (j = i - group; j >= 0; j -= group)

                    { 

                   //一般插入排序方法。

                        if (unsorted[j] > unsorted[j + group])

                        {

                           //如果前面数据比后面大,就交换位置。

                            temp = unsorted[j];

                            unsorted[j] = unsorted[j + group];

                            unsorted[j + group] = temp;

                        }

                    }

                }

            }

        }

        static void Main(string[] args)

        {

            int[] x = { 6, 2, 4, 1, 5, 9 };

            shell_sort(x, x.Length);

            foreach (var item in x)

            {

                Console.WriteLine(item);

            }

            Console.ReadLine();

        }

 

js排序介绍

标签:

原文地址:http://www.cnblogs.com/lihui1256/p/4883152.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!