冒泡/快速排序
protected void Page_Load(object sender, EventArgs e)
{
int[] ary = new int[11] { 5, 4, 33, 6, 7, 2, 45, 34, 56, 76, 34 };
//bubbleSort(ary);
QuickSort(ary, 0, ary.Length - 1);
for (int i = 0; i < ary.Length; i++)
{
Response.Write(ary[i].ToString() + " ");
}
}
/// <summary>
/// 冒泡排序
/// 将第一个记录ary[0]与第二个记录ary[1]比较,若前者大于后者,则两则交换位置。
/// 然后,对新的第二个记录ary[1]和第三个记录ary[2]比较,做同样的处理。
/// 依此类推,直到处理完第n-1个记录和第n个记录。
/// 经过这次起泡,n个记录中最大者被安置到第n个位置上。
/// 此后,再对前n-1个记录进行同样处理,使n-1个记录中的最大者被安置到整个序列的第n-1个位置上。
/// 然后,再对前n-2个记录重复上述过程...这样最多做n-1次起泡就能完成排序。
/// </summary>
/// <param name="ary"></param>
/// <returns></returns>
private void bubbleSort(int[] ary)
{
int tmp;
bool bDone;
for (int i = 0; i < ary.Length; i++) //起泡次数
{
bDone = true;
for (int j = 0; j < ary.Length - i - 1; j++) //每次起泡,比较从ary[0]到ary[n-i]的记录
{
if (ary[j] > ary[j + 1])
{
tmp = ary[j];
ary[j] = ary[j + 1];
ary[j + 1] = tmp;
bDone = false;
}
}
if (bDone) break; //本趟起泡未发生记录交换,算法结束
}
}
/// <summary>
/// 快速排序
/// </summary>
/// <param name="ary"></param>
/// <param name="begin"></param>
/// <param name="end"></param>
private void QuickSort(int[] ary, int begin, int end)
{
if (begin >= end) return;
int i = QuickSort_Once(ary, begin, end);
QuickSort(ary, begin, i - 1); //对左边排序
QuickSort(ary, i + 1, end); //对右边排序
}
/// <summary>
/// 一次快速排序
/// 在待排序的n个记录中取第一个记录,把所有小于该记录的记录移到其左边,大的移到右边
/// </summary>
/// <param name="ary"></param>
/// <param name="begin"></param>
/// <param name="end"></param>
/// <returns></returns>
private int QuickSort_Once(int[] ary, int begin, int end)
{
int i = begin, j = end;
int tmp = ary[i]; //保存第一个元素,相当于留空第一个位置
while (i < j)
{
while (ary[j] >= tmp && i < j) j--; //当右边的元素大于tmp时,继续向左扫描
ary[i] = ary[j]; //此时找到了由右至左扫描的第一个小于tmp的元素,把此元素放到上一个空位里,相当于j位置留空
while (ary[i] <= tmp && i < j) i++; //当左边的元素小于tmp时,继续向右扫描
ary[j] = ary[i]; //此时找到了由左至右扫描的第一个大于tmp的元素,把此元素放到上一个空位里,相当于i位置留空
}
ary[i] = tmp; //此时i=j
return i; //得到传入数组ary的首元素的最终位置
}