zoukankan      html  css  js  c++  java
  • 使用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>
  • 相关阅读:
    沿着河边走,环城60公里
    与客家土楼的约会(叶剑英故居福建)
    与客家土楼的约会(增城河源)
    与客家土楼的约会(东源龙川)
    C#几个经常犯错误
    C# 获取当前路径方法
    C# Stopwatch与TimeSpan详解
    话说程序员成熟的标志
    C#开源项目介绍
    C#各种加密算法的研究
  • 原文地址:https://www.cnblogs.com/JDotNet/p/3489737.html
Copyright © 2011-2022 走看看