本文主要是介绍算法 quick sort,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- // --------------------------------------------------------------------------------------------------------------------
- //
- //
- // Respect the work.
- //
- // </copyright>
- // <summary>
- //
- // The quick sort.
- //
- // 快速排序(QuickSort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
- //
- // 设要排序的数组是a[0]...a[N-1],首先任意选取一个数据(通常选用数组的首元素)作为关键数据,然后将所有比它小的数都放到它的前面,所有比它大的数都放到它的后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
- // 一趟快速排序的算法是:
- // 1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
- // 2)以数组首元素作为关键数据,赋值给pivot,即pivot=a[0];
- // 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于pivot的值a[j],将a[j]赋值给a[i];
- // 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于pivot的值a[i],将a[i]赋值给a[j];
- // 5)重复第3、4步,直到i==j;(在3、4步中,若没找到符合条件的值,即3中a[j]不小于pivot,4中a[i]不大于pivot的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。若找到符合条件的值,进行替换的时候i、j指针位置不变。)
- //
- // 快速排序的平均时间复杂度是:O(nlog<sub>2</sub>n)。
- //
- // </summary>
- // --------------------------------------------------------------------------------------------------------------------
- namespace CSharpLearning
- {
- using System;
- /// <summary>
- /// The program.
- /// </summary>
- public static class Program
- {
- /// <summary>
- /// The main.
- /// </summary>
- public static void Main()
- {
- int[] a = { 101, 93, 856, 7, 62, 15, 84, 3, 298, 1256 };
- Console.WriteLine("Before Quick Sort:");
- foreach (int i in a)
- {
- Console.Write(i + " ");
- }
- Console.WriteLine("\r\n");
- Console.WriteLine("In Quick Sort:");
- QuickSort(a, 0, 9);
- Console.WriteLine("\r\nAfter Quick Sort:");
- foreach (int i in a)
- {
- Console.Write(i + " ");
- }
- Console.WriteLine(string.Empty);
- }
- /// <summary>
- /// 快速排序。
- /// </summary>
- /// <param name="a">
- /// 待排序数组。
- /// </param>
- /// <param name="low">
- /// 待排序数组的排序起始位置。
- /// </param>
- /// <param name="high">
- /// 待排序数组的排序终止位置。
- /// </param>
- private static void QuickSort(int[] a, int low, int high)
- {
- if (low >= high)
- {
- return;
- }
- int pivot = QuickSortOnce(a, low, high);
- // 输出每一次排序。
- foreach (int i in a)
- {
- Console.Write(i + " ");
- }
- Console.WriteLine(string.Empty);
- // 对枢轴的左端进行排序。
- QuickSort(a, low, pivot - 1);
- // 对枢轴的右端进行排序。
- QuickSort(a, pivot + 1, high);
- }
- /// <summary>
- /// 一趟快速排序。
- /// </summary>
- /// <param name="a">
- /// 待排序数组。
- /// </param>
- /// <param name="low">
- /// 待排序数组的排序起始位置。
- /// </param>
- /// <param name="high">
- /// 待排序数组的排序终止位置。
- /// </param>
- /// <returns>
- /// 返回枢轴的位置。
- /// </returns>
- private static int QuickSortOnce(int[] a, int low, int high)
- {
- // 将首元素作为枢轴。
- int pivot = a[low];
- int i = low, j = high;
- while (i < j)
- {
- // 从右到左,寻找首个小于pivot的元素。
- while (a[j] >= pivot && i < j)
- {
- j--;
- }
- // 执行到此,j一定指向从右端起首个小于或等于pivot的元素。执行替换。
- a[i] = a[j];
- // 从左到右,寻找首个大于pivot的元素。
- while (a[i] <= pivot && i < j)
- {
- i++;
- }
- // 执行到此,i一定指向从左端起首个大于或等于pivot的元素。执行替换。
- a[j] = a[i];
- }
- // 退出while循环,执行至此,必定是i==j的情况。i(或j)指向的即是枢轴的位置,定位该趟排序的枢轴并将该位置返回。
- a[i] = pivot;
- return i;
- }
- }
- }
- // Output:
- /*
- Before Quick Sort:
- 101 93 856 7 62 15 84 3 298 1256
- In Quick Sort:
- 3 93 84 7 62 15 101 856 298 1256
- 3 93 84 7 62 15 101 856 298 1256
- 3 15 84 7 62 93 101 856 298 1256
- 3 7 15 84 62 93 101 856 298 1256
- 3 7 15 62 84 93 101 856 298 1256
- 3 7 15 62 84 93 101 298 856 1256
- After Quick Sort:
- 3 7 15 62 84 93 101 298 856 1256
- */
这篇关于算法 quick sort的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!