快速排序算法。
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];

浙公网安备 33010602011771号