内排序-快速排序
Posted mytrip
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内排序-快速排序相关的知识,希望对你有一定的参考价值。
算法思想:通过一趟排序将待排序列分割成独立的两部分,其中一部分均比另外一部分小,则可对这两部分继续继续排序,重复之前步骤,以达到整个序列有序的目的.它是由图灵获得者 Tony Hoare设计出来的,该算法被列为20世纪十大算法之一.
//寻找关键值的位置,最后一次性移过去
class QuickSort_1
{
static void Main(string[] args)
{
int[] a = new int[] { 20, 30, 90, 40, 70, 110, 60, 10, 100, 50, 80,9,8,7,6 };
QuickSort_1 quickSort = new QuickSort_1();
quickSort.Sort(a, 0, a.Length - 1);
foreach (int i in a)
{
Console.WriteLine(i);
}
Console.ReadLine();
}
/// <summary>
/// 交换数据
/// </summary>
/// <param name="datas"></param>
/// <param name="index1"></param>
/// <param name="index2"></param>
void ExchangeData(int[] datas, int index1, int index2)
{
if (index1 < 0 || index2 < 0 || index1 >= datas.Length || index2 >= datas.Length)
{
return;
}
datas[index1] = datas[index2] + (datas[index2] = datas[index1]) * 0;
}
public void Sort(int[] arrays, int left_index, int right_index)
{
if (left_index == right_index) return;
int important = left_index;//关键值
int cur_left = left_index;//左游标
int cur_right = right_index;//右游标
while (cur_left < cur_right)//当左右游标未相遇时
{
while (arrays[cur_right] >= arrays[important] && cur_left < cur_right)
{
cur_right--;//先从右游标开始 ,递减遇到小于关键元素的值
}
while (arrays[cur_left] <= arrays[important] && cur_left < cur_right)
{
cur_left++;//再从左游标开始 ,递减遇到大于关键元素的值
}
if (cur_left <cur_right && arrays[cur_left] > arrays[cur_right])
{
ExchangeData(arrays, cur_left, cur_right);//当游标未相遇时,并且前值大于后值时,交换这两个游标指向的值
}
}
if (cur_left == cur_right )
{//当游标相遇时
ExchangeData(arrays, important, cur_right);//把关键值交换到相遇位置
important = cur_left;
Sort(arrays, left_index, important - 1);// 将关键值左边的序列 重复以上过程
Sort(arrays, important + 1, right_index);//将关键值右边的序列 重复以上过程
}
}
}
以上是关于内排序-快速排序的主要内容,如果未能解决你的问题,请参考以下文章