快速排序算法。

http://www.cnblogs.com/huankfy/articles/1446588.html

 1    /* 快速排序
 2    ** 作者:huankfy
 3    ** 时间:2009-04-29
 4    */
 5    public class MyQuickSort
 6    {
 7        int[] data = new int[] { 10, 2, 5, 7, 3, 1, 20, 34, 4, 6, 30, 100, 23, 8 };
 8
 9
10        public void Display()
11        {
12            Sort(data, 0, data.Length - 1);
13            Console.WriteLine("快速排序结果为:");
14            for (int i = 0; i < data.Length; i++)
15                Console.WriteLine(data[i]);
16        }
17
18        private void Sort(int[] a, int left, int right)
19        {
20            if (left < right)
21            {
22                int i = Partition(a, left, right);
23                Sort(a, left, i - 1);
24                Sort(a, i + 1, right);
25            }
26        }
27
28        private int Partition(int[] a, int left, int right)
29        {
30
31            int tmp = a[left];
32            while (left < right)
33            {
34                while (left < right && a[right] >= tmp)
35                    right--;
36                
37                // 换位后不能将left+1,防止跳位
38                if(left<right)
39                    a[left] = a[right];
40
41                while (left < right && a[left] <= tmp)
42                    left++;
43
44                if (left < right)
45                {
46                    a[right] = a[left];
47                    // 有left < right,可将right向前推一位
48                    right--;
49                }
50            }
51
52            a[left] = tmp;
53
54            return left;
55        }
56
57    }

  

http://www.cnblogs.com/zhujian198/archive/2008/05/13/1195016.html

using System;
/*
作者:朱剑
描写:C#实现快速排序算法
创建日期:2006/05/08
*/
namespace ConsoleApplication1
{
    class DataStructDemo
    {
        static void swap(ref int a,ref int b)
        {
            int temp;
            temp=a;
            a=b;
            b=temp;
        }
        static void sort(int[] arr,int left,int right)
        {
            int i,j,s;

            if(left < right)
            {
                i=left - 1;
                j=right + 1;
                s=arr[(i + j) / 2];
                while(true)
                {
                    while(arr[++i]<s);
                    while(arr[--j]>s);
                    if(i>=j)
                        break;
                    swap(ref arr[i],ref arr[j]);
                }
                sort(arr,left,i-1);
                sort(arr,j+1,right);
            }
        }
            [STAThread]
        static void Main(string[] args)
        {
                int[] arr={2,4,65,76,87,90,56,89,78};
                sort(arr,0,arr.Length-1);
                 Console.WriteLine("            Quick Sort Test!!!");
                for(int i=0;i<arr.Length;i++)
                {
                    Console.WriteLine(arr[i]);
                }
        }
    }
}

  

 public static void Test快速排序()
        {
            var list = new List<int>() { 10,20,22,1,13,7,50,42,31,66,14};
            // QuickSort(ref list, 0, list.Count);
            Sort1(list, 0, list.Count);
        }

        public static void Sort1(List<int> list,int left ,int right)
        {
            if (left < right)
            {
                var i = left;
                var j = right - 1;
                var num = list[(left + right) / 2];
                while (true)
                {
                    while (list[i] < num)
                    {
                        i++;
                    };
                    while (j>0&&list[j] > num)
                    {
                        j--;
                    }
                    if (i >= j)
                        break;
                    var a = list[i];
                    list[i] = list[j];
                    list[j] = a;
                }
                Sort1(list, left, i);
                Sort1(list, i + 1, right);
            }
        }

 

 

 

2种算法实现有细微的区别,第二个好理解一点,主要用到递归,不过整体思路是

1,找最中间数做基准,

2,从后往前找到第一个小于基准的索引

3,从前往后找到第一个大于基准的索引

4,交换2,3值的位置。

5,从2继续向前找,从3继续向后找,各自找到第一个,交换位置,直到找到最中间

6,从最中间位置分成A,B2部分,再分别执行1-5的步骤

 

 

 es6中的变量交换

let x = 1;
let y = 2;
[x, y] = [y, x];
posted @ 2014-10-10 00:31  莫欺  阅读(191)  评论(0编辑  收藏  举报