快速排序:
快速排序的基本算法思想是;设待排序的元素序列个数为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)。