最近想学习算法,所以还是从排序算法练练手,这里分析一下快速排序的思想和C#语言实现,若有不正确之处,请批评指正,笔者不胜感激,若有志同道合的朋友,可以加本人QQ:491880231,一起畅谈码农的世界!
快速排序的虽然比较简单,但对于比较久没接触的朋友来说,还是容易遗忘的,本人觉得这里有两个难点:
1、快速排序中心思想
快速排序的思想归纳起来有的三步:①任意选取序列中的一个元素,用此元素作为“中间元素”,这里说明一下,这个“中间元素”,排序后不一定刚好在序列的中间。②在序列中取出所有大于“中间元素”的元素,放在“中间元素”的右边。③在序列中取出所有小于“中间元素”的元素,放在“中间元素”的左边。经过这三步后便完成了一轮排序。
2、递归调用
经过一轮排序后,序列一般被“中间元素”分成两部分,一部分比“中间元素”小,另一部分反之。所以我们要继续排序剩下的两部分,所以我们要理解递归的思想,只要我们继续利用以上的三步,排序剩下的两部分,最终便会排序完整个序列。
刚开始接触的朋友可能会不太理解我以上说的,这里贴出C#代码,不懂的话直接研究代码可能会比较适合码农:
class Program
{
static void Main(string[] args)
{
int[] a = { 57, 68, 59, 52, 72, 28, 96, 33, 24 };
Quicksort(a, 0, a.Length - 1);/*这里原文第三个参数要减1否则内存越界*/
for (int i = 0; i < a.Length; i++)
{
if (i == a.Length - 1)
{
Console.WriteLine("{0}", a[i]);
break;
}
Console.Write("{0},", a[i]);
}
}
public static void Quicksort(int[] a, int low, int high)
{
if (low >= high)
{
return;
}
int first = low, last = high;
//此时a[low]被保存到key,所以元素a[low]可以当作是一个空位,用于保存数据,之后每赋值一次,也会有一个位置空出来,直到last==first,此时a[last]==a[first]=key
int key = a[low];
while (first < last)
{
while (first < last && a[last] >= key)
{
last--;
}
a[first] = a[last];
while (first < last && a[first] <= key)
{
first++;
}
a[last] = a[first];
}
a[first] = key;
//递归排序数组左边的元素
Quicksort(a, low, first - 1);
//递归排序右边的元素
Quicksort(a, first + 1, high);
}
}