jQuery插件Asgrid添加表头排序的功能

       在完成了Asgrid的基本功能后,还需要一个排序的功能。回想一下数据结构和算法,有很多的排序算法。在维基百科上找到的排序算法

image

       在这里并不需要很复杂的排序,在这里我选择了快速排序算法

       快速排序在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

  添加表头点击事件

       首先给控件添加两个新的参数用来记录当前的排序状态:

           storKey :记录当前点击的表头列

           order:记录当前排序,有两个值asc,desc

       点击事件代码:

 $(".AsGrid_head_col").click(function () {
                    if (!def.data || def.data.length <= 1)
                        return;

                    var index = $(".AsGrid_head_col").index($(this));
                    if (index < 0)
                        return;
                         
                    if (!def.columns[index].checkbox) {
                        var key = def.columns[index].field;

                        if (def.storKey == key) {
                            //反向排序
                            def.order = def.order == 'asc' ? 'desc' : 'asc';
                        }
                        else {
                            def.storKey = key;
                            def.order = 'asc';
                        }
                        $(".head_ts").removeClass("head_ts_asc head_ts_desc");

                        $(this).find(".head_ts").addClass("head_ts_"+def.order);

                        quickSort(def.data, def.storKey, def.order, 0, def.data.length - 1);

                        methods.loadData(tb, def.data);
                    }
     

         其中quickSort为快速排序算法

排序算法

 function quickSort(arr, key, order, low, high)

 

arr  :要排序的数组

key:当前需要排序的列主键

order:正序(asc)还是反序(desc)

low:开始值

high:结束值

 function quickSort(arr, key, order, low, high) {
        if (arr.lenght <= 1)
            return;
        if (low < high) {
            var pivot = arr[low];
            var i = low;
            var j = high;
            if (order == 'asc') {
                while (i < j) {
                    while (i < j && arr[j][key] >= pivot[key]) j--;
                    arr[i] = arr[j];
                    while (i < j && arr[i][key] <= pivot[key]) i++;
                    arr[j] = arr[i];
                }
                arr[i] = pivot;
            }
            else {
                while (i < j) {
                    while (i < j && arr[j][key] <= pivot[key]) j--;
                    arr[i] = arr[j];
                    while (i < j && arr[i][key] >= pivot[key]) i++;
                    arr[j] = arr[i];
                }
                arr[i] = pivot;

            }

            quickSort(arr, key, order, low, i - 1);
            quickSort(arr, key, order, i + 1, high);
        }

 

      一个没什么难度的算法,搞了半天,记录一下。

posted @ 2013-05-08 16:11  张巍的博客  阅读(483)  评论(0编辑  收藏  举报