如何让5.6.7后面那三种方法直接显示出结果呢?
就是不按8,让它像2.3.4前面那三种方法直接显示出排序结果来。求解中...谢谢。
using System;
namespace Sort
{
public class SortArithMetic
{
/* 直接插入排序算法 */
public void InsertSort(SeqList<int> R)
{
for (int i = 1; i < R.Length; i++)
{
if (R.Data[i] < R.Data[i - 1])
{
int temp = R.Data[i];
int j = 0;
for (j = i - 1; j >= 0 && temp < R.Data[j]; j--)
{
R.Data[j + 1] = R.Data[j];
}
R.Data[j + 1] = temp;
}
//显示排序过程
Console.Write("第{0}趟排序结果为:\n",i);
for (int k = 0; k < R.Length; k++)
{
Console.Write("{0} ", R.Data[k]);
}
Console.Write("\n");
}
}
public void ShellSort(SeqList<int> R, int[] increment)
{//希尔排序中的一趟排序,d为当前增量
int i, j, temp, d;
for (int m = 0; m < increment.Length; m++)
{
d = increment[m];
//将R[d+1…n]分别插入各组当前的有序区
for(i=d;i<R.Length;i++)
if (R.Data[i] < R.Data[i - d])
{
temp = R.Data[i]; j = i - d;
do
{//查找R[i]的插入位置
R.Data[j + d] = R.Data[j]; //后移记录
j = j - d; //查找前一记录
}
while (j > 0 && temp < R.Data[j]);
R.Data[j + d] = temp; //插入R[i]到正确的位置上
}
//显示排序过程
Console.Write("第{0}趟排序结果为:\n", i);
for (int k = 0; k < R.Length; k++)
{
Console.Write("{0} ", R.Data[k]);
}
Console.Write("\n");
}
}
//直接选择排序
public void SelectSort(SeqList<int> R)
{
int i, j, k;
int temp;
for (i = 0; i < R.Length - 1; i++)
{//做第i趟排序
k = i;
for (j = i + 1; j < R.Length; j++)
if (R.Data[j] < R.Data[k])
k = j;//k记下目前找到的最小关键字所在的位置
if(k!=i)
{
//交换
temp = R.Data[i]; R.Data[i] = R.Data[k]; R.Data[k] = temp;
}
//显示排序过程
Console.Write("第{0}趟排序结果为:\n", i);
for (int q = 0; q < R.Length; q++)
{
Console.Write("{0} ", R.Data[q]);
}
Console.Write("\n");
}
}
//冒泡排序
public void BubbleSort(SeqList<int> R)
{
int i, j;
Boolean exchange; //交换标志
int tmp;
int n = R.Length;
for (i = 1; i < n; i++)
{//最多做n-1趟排序
exchange = false; //本趟排序开始前,交换标志应为假
for (j = 0; j < n - i; j++) //对当前无序区R[0…n-i]自下向上扫描
if (R.Data[j] > R.Data[j + 1])
{//交换记录
tmp = R.Data[j + 1];
R.Data[j + 1] = R.Data[j];
R.Data[j] = tmp;
exchange = true; //发生了交换,故将交换标志置为真
}
if (!exchange) //本趟排序未发生交换,提前终止算法
return;
}
}
//快速排序
public void QuickSort(SeqList<int> sqList, int low, int high)
{
if (low > high) return;
int pivot = sqList.Data[low];
int i = low + 1;
int j = high;
int temp;
while (i < j)
{
while ((i < j) && (sqList.Data[i] <= pivot))
{
++i;
}
while ((j >= i) && (sqList.Data[j] >= pivot))
{
--j;
}
if (i < j)
{
temp = sqList.Data[i];
sqList.Data[i] = sqList.Data[j];
sqList.Data[j] = temp;
}
}
if (low < j)
{
temp = sqList.Data[low];
sqList.Data[low] = sqList.Data[j];
sqList.Data[j] = temp;
}
QuickSort(sqList, low, j - 1);
QuickSort(sqList, j + 1, high);
}
//归并排序
public void MergeSort(SeqList<int> sqList)
{
int k = 1; //归并增量
while (k < sqList.GetLength())
{
Merge(sqList, k);
k *= 2;
}
}
public void Merge(SeqList<int> sqList, int len)
{
int m = 0; //临时顺序表的起始位置
int l1 = 0; //第1个有序表的起始位置
int h1; //第1个有序表的结束位置
int l2; //第2个有序表的起始位置
int h2; //第2个有序表的结束位置
int i = 0;
int j = 0;
//临时表,用于临时将两个有序表合并为一个有序表
SeqList<int> tmp = new SeqList<int>(sqList.GetLength());
//归并处理
while (l1 + len < sqList.GetLength())
{
l2 = l1 + len; //第2个有序表的起始位置
h1 = l2 - 1; //第1个有序表的结束位置
//第2个有序表的结束位置
h2 = (l2 + len - 1 < sqList.GetLength()) ? l2 + len - 1 : sqList.Length - 1;
j = l2;
i = l1;
//两个有序表中的记录没有排序完
while ((i <= h1) && (j <= h2))
{
//第1个有序表记录的关键码小于第个有序表记录的关键码
if (sqList.Data[i] <= sqList.Data[j])
{
tmp.Data[m++] = sqList.Data[i++];
}
//第2个有序表记录的关键码小于第个有序表记录的关键码
else
{
tmp.Data[m++] = sqList.Data[j++];
}
}
//第1个有序表中还有记录没有排序完
while (i <= h1)
{
tmp.Data[m++] = sqList.Data[i++];
}
//第2个有序表中还有记录没有排序完
while(j<=h2)
{
tmp.Data[m++] = sqList.Data[j++];
}
l1 = h2 + 1;
}
i = l1;
//原顺序表中还有记录没有排完
while(i<sqList.GetLength())
{
tmp.Data[m++] = sqList.Data[i++];
}
//临时顺序表中的记录复制到原顺序表,使原顺序表中的记录有序
for(i=0;i<sqList.GetLength();++i)
{
sqList.Data[i] = tmp.Data[i];
}
}
}
}
Sort.zip
(36.25 KB)