使用JavaScript和C#实现常用算法

原文地址http://www.cnblogs.com/taomylife/p/3429240.html,感谢分享!!!

1、快速排序(QuickSort)

JavaScript:

首先,从要排序的序列中先选取一个中间元素作为基准元素,遍历序列中的每一个元素,小于基准元素的放入一个新序列,否则放入另一个新序列;然后,使用递归方式处理每一个得到的新序列,直到得到的新序列不可再分割;最后,将每一层递归得到的新序列和基准元素进行连接。

<script type="text/javascript">
            function quickSort(arr) {
                if(arr.length <= 1) {
                    return arr;
                }
                /*选取一个基准元素*/
                var pivotIndex = Math.floor(arr.length / 2);
                var pivot = arr.splice(pivotIndex, 1)[0];
                /*****************/
                var left = [];
                var right = [];

                for(var i=0; i<arr.length; i++) {
                    if(arr[i] < pivot) {
                        left.push(arr[i]);
                    }
                    else {
                        right.push(arr[i]);
                    }
                }

                return quickSort(left).concat(pivot, quickSort(right));
            }

            alert(quickSort([12,1,4,8,2]).join(','));//'1,2,4,8,12'
        </script>
c#

首先,从要排序的序列中先选取一个中间元素作为基准元素,从序列起始处开始向后循环,循环条件是序列元素小于基准元素,再从序列结尾处向前循环,循环条件是序列元素大于基准元素,将上述循环结束时的元素进行左右交换,这样小于基准元素的元素都在其左边,否则在其右边;然后使用递归用前述方式循环基准元素左右两边的新序列。

namespace TestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> list = new List<int>() { 5, 4, 3, 2, 1, 6, 5, 4, 3, 2, 1 };
            QuickSort(ref list, 0, list.Count - 1);
            foreach (int item in list)
            {
                System.Console.WriteLine(item.ToString());
            }
            System.Console.ReadKey();
        }

        private static void QuickSort(ref List<int> list, int left, int right)
        {
            if (left < right)
            {
                int i = left;
                int j = right;
                int middle = list[(left + right) / 2];
                while (true)
                {
                    while (i < right && list[i] < middle) { i++; }
                    while (j > 0 && list[j] > middle) { j--; }
                    if (i == j) break;
                    list[i] = list[i] + list[j];
                    list[j] = list[i] - list[j];
                    list[i] = list[i] - list[j];
                    if (list[i] == list[j]) j--;
                }

                QuickSort(ref list, left, i);
                QuickSort(ref list, i + 1, right);
            }
        }
    }
}

2、归并排序(merge sort)

JavaScript
<script type="text/javascript">
            //合并两个已经排好序的数组
            function mergeSortedList(left, right) {
                var result = [];
                var il = 0;
                var ir = 0;

                while(il < left.length && ir < right.length) {
                    if(left[il] < right[ir]) {
                        result.push(left[il++]);
                    }
                    else {
                        result.push(right[ir++]);
                    }
                }

                return result.concat(left.slice(il)).concat(right.slice(ir));
            }

            function mergeSort(list) {
                if(list.length < 2) {
                    return list;
                }

                var middle = Math.floor(list.length / 2),
                    left = list.slice(0, middle),
                    right = list.slice(middle),
                    params = mergeSortedList(mergeSort(left), mergeSort(right));

                //在params头部插入的这两个元素为调用splice方法时传入第一、二个参数
                params.unshift(0, params.length);
                list.splice.apply(list, params);

                return list;
            }

            var arr = [1,4,87,2,1,4,6,9,2,0];

            alert(mergeSort([1,4,87,2,1,4,6,9,2,0]).join(','));
            //使用自带sort方法进行排序
            alert(arr.sort(function(a, b) {return a - b; }).join(','));
        </script>

3、插入排序

JavaScript

1、从逻辑上考虑将序列分成两部分(已排好序的和没排好序的两部分),假定已排好序的为A序列,未排好序的为B序列,排序开始前A序列为空,B序列为整个序列;

2、设置两层for循环,外层按下标从小到大遍历B序列,内层按下标从大到小遍历A序列,A序列的最后一个元素始终是B序列第一个元素的前一个;

3、外层循环每一次遍历时取出一个值compareValue作为B中第一个元素,内层循环从A序列的最后一个开始(currentlyValue)与compareValue进行比较,当currentlyValue大于compareValue时,将currentlyValue赋值给其下一个元素。

<script type="text/javascript">
            function insertationSort(items) {
                var len = items.length,
                    value, //当前要比较的值
                    i, //无序区域下标
                    j; //有序区域下标

                for(i = 0; i < len; i++) {
                    value = items[i];

                    for(j = i - 1; j > -1 && items[j] > value; j--) {
                        items[j + 1] = items[j];
                    }

                    items[j + 1] = value;
                }

                return items;
            }

            alert(insertationSort([5, 2, 4, 6, 0, 1]).join(','));
        </script>

4、选择排序

原理:选定序列中的任意一个元素,将其看成是最小的一个元素,然后和其它元素一一比较,若发现其它元素比较其更小,则交换二者,然后该更小的元素看成是最小元素,再次进行比较,直到序列中每一个元素都进行比较后排序结束。

<script type="text/javascript">
            function swapItem(items, firstIndex, secondIndex) {
                var temp = items[firstIndex];
                items[firstIndex] = items[secondIndex];
                items[secondIndex] = temp;
            }

            function selectionSort(items) {
                var minIndex;

                for(var i = 0; i < items.length; i++) {
                    minIndex = i;
                    for(var j = i + 1; j < items.length; j++) {
                        if(items[j] < items[minIndex]) {
                            minIndex = j;
                        }
                    }

                    if(i != minIndex) {
                        swapItem(items, i, minIndex);
                    }
                }

                return items;
            }

            alert(selectionSort([5,4,2,6,1,0]).join(','));
        </script>

5、冒泡排序

原理:从序列的起始处或结尾处开始,每相邻两个元素进行比较,若前者大于后者,则交换二者,直到比较到序列最后或最前,找到一个最大元素放在最后。每一次对序列遍历都取出一个最大元素(下一次遍历会将上次遍历取出的最大值排除)。

<script type="text/javascript">
            function swap(items, firstIndex, secondIndex){
                var temp = items[firstIndex];
                items[firstIndex] = items[secondIndex];
                items[secondIndex] = temp;
            }

            function bubbleSort1(items) {
                var len = items.length, i, j, stop;

                for(i = 0; i < len; i++) {
                    for(j = 0, stop = len - i; j < stop; j++) {
                        if(items[j] > items[j + 1]) {
                            swap(items, j, j + 1);
                        }
                    }
                }

                return items;
            }

            function bubbleSort2(items) {
                var len = items.length, i, j;

                for(i = len - 1; i  >= 0; i--) {
                    for(j = len - i; j >= 0; j--) {
                        if(items[j] < items[j - 1]) {
                            swap(items, j, j - 1);
                        }
                    }
                }

                return items;
            }

            alert(bubbleSort1([3, 2, 4, 5, 1]).join(','));
            alert(bubbleSort2([3, 2, 4, 5, 1]).join(','));
        </script>
原文地址:https://www.cnblogs.com/JDotNet/p/3489737.html