当前位置:编程学习 > C#/ASP.NET >>

快速排序~~程序有点不理解~~

using System;
using System.Collections.Generic;
using System.Text;

namespace QuickSort
{
    class Program
    {
        
        public void Swap(ref int i,ref  int j)
        {
            int temp;
            temp = i;
            i= j;
            j = temp;
        }
        public int  Partition(int[] l,int left, int right)
        {
            int i, j;
            
            i = left-1; 
            j = right +1;
            do
            {
                do i++; while (l[i] < l[left]);
                do j--; while (l[j] > l[left]);
                if(i<j) Swap(ref l[i],ref l[j]);
            } while (i < j);
            Swap(ref l[left],ref l[j]);
            return j;
        }
        public void Quick(int[] l,int left, int right)
        {
            int j;
            if (left <right)
            {
                j = Partition(l,left,right);
                Quick(l,left, j - 1);
                Quick(l,j + 1, right);
            }
            
           
        }
        static void Main(string[] args)
        {
            Program p = new Program();
            int[] array = new int[10] { 5, 7, 10, 2, 4, 3, 9, 8, 0, 6 };
            p.Quick(array,0,array.Length-1);
            for (int i = 0; i < 10; i++)
            {
                Console.Write(array[i]+" ");
            } 
            Console.ReadLine();
        }
    }
}


函数Partition()里面i为什么不是left,而是left-1  ??? --------------------编程问答-------------------- --------------------编程问答-------------------- 因为后面的 do i++ 部分,因为第一次执行循环时会先+1的 --------------------编程问答-------------------- 是有点扰人~ --------------------编程问答-------------------- i = left-1; 
j = right +1;
do
{
do i++; while (l[i] < l[left]); --------------------编程问答-------------------- 用这么绕么?static void QuickSort(int[] a, int l, int r) 
        {
            int left = l;
            int right = r;
            int pivot = a[(l + r) / 2];
            int temp;
            while (l < r)
            {
                while (a[l] < pivot) { ++l; }
                while (a[r] > pivot) { --r; }
                if (l >= r) break;
                temp = a[l];
                a[l] = a[r];
                a[r] = temp;
                if (a[l] != pivot) { ++l; }
                if (a[r] != pivot) { --r; }
            }            
            if (left < r) { QuickSort(a, left, l - 1); }          
            if (l < right) { QuickSort(a, r + 1, right); }
        }
        static void Main(string[] args)
        {
            int[] aa ={ 74, 5, 78, 2, 46, 32, 10, 97, 34 };
           
            QuickSort(aa, 0, 8);
         
            for (int i = 0; i < aa.Length; i++) 
            {
                Console.WriteLine(aa[i]);
            }
            Console.Read();
        } --------------------编程问答-------------------- 帮顶,学习了· 标记 --------------------编程问答-------------------- 因为left已经走到right右边(下一位)去了。 --------------------编程问答-------------------- 第一轮的时候,不就应该是将下标为0的元素作为分割元素,然后从下标为1的元素向后找么,那么left被赋值为0,然后i=left时,i=0;进人下面的循环,i++不正好变为1么
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,