交换排序_2.快速排序

来源:互联网 发布:淘宝上传图片怎么上传 编辑:程序博客网 时间:2024/05/01 06:53

快速排序:

      快速排序的基本算法思想是;设待排序的元素序列个数为n,存放在数组a中,令第一个元素为枢轴元素,即将a[0]作为参考元素,令pivot=a[0].初始时,令i=0;j=a.Legth-1;然后按以下方法操作:

  (1).从序列的j位置往前,依次将数组的中的元素与枢轴元素相比较,如果当前元素大于等于枢轴元素,则将前一个元素与枢轴元素相比较,否则将当前元素移动到位置i,即比较a[j]pivot,如果a[j]>=pivot,则连续执行j--操作,直到找到一个元素,使a[j]<pivot,则将a[j]移动到a[i]中,并执行一次i++;

  (2).从序列的i位置开始,一次将元素值与枢轴元素相比较。如果当前元素小于枢轴元素,则将后一个元素与枢轴元素相比较,否则,将当前元素移动的位置j,即比较a[i]pivot,如果a[i]<pivot,则连续执行i++,直到遇到一个元素使a[i]>=pivot,a[i]移动到a[j]中,并执行一次j--

  (3).循环执行步骤1,2,直到出现i>=j,将元素pivot移动到a[j]中,此时整个元素序列被位置j划分为两个部分,前一部分元素的值都小于枢轴,后一部分元素的值都大于枢轴。即完成看一次快速排序。

  实现代码:(C#实现)

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

namespace kuaisupaixu
{
    class Program
    {
        static void Main(string[] args)
        {


            int[] b = new int[] { 37, 19, 43, 22, 22, 89, 26, 92 };//待排序数组
       
            int low = 0;
            int high = b.Length - 1;

             digui(b,low,high);


             for (int n = 0; n < b.Length; n++)
             {
                 Console.WriteLine(b[n]);

             }

             Console.ReadKey();
        }

      static void digui(int[] b,int low,int high){
          int m;
           if (low < high) {
              m = paiXu(b, low, high);//得到返回的枢轴所在的索引
              digui(b, low, m-1);//将枢轴左面的子序列进行排序
              digui(b, m + 1, high);//将枢轴右面的子序列进行排序
           }       
          
        }
      
       static int  paiXu(int[] a,int i,int j){
            int p=a[i];//把枢轴记录下来
            while (i < j) {
                while (i < j && a[j] >= p) {
                    j--;
                }
                if (i < j) {
                    a[i] = a[j];
                   
                    i++;
                }
                while (i < j && a[i] < p) {
                    i++;
                }
                if (i < j) {
                    a[j] = a[i];
                   
                    j--;
                }
              
            }
            a[i] = p;


            return j;

          
        }

       
    }
}


 快速排序是一种不稳定的排序算法,时间复杂度为O(nlog2n)(n倍的log2底n)。

 

0 0