四、选择排序
4.1直接选择排序
思路:选择n个元素中最小的数据元素交换,放在第一个记录上。
步骤:1.外层循环记录有序区的第一位置。
2.内层循环在无序区找到最小元素,并执行交换操作。
描述:
设计:
Code
using System;
public class mySelectSort
{
private int[] mat;
public mySelectSort(int[] table)
{
mat=new int[table.Length];
table.CopyTo(mat,0); //数组拷贝
}
public void selectSort()
{
int min;
for(int i=0;i<mat.Length;i++)
{
min=i; //记录当前指针
for(int j=i;j<mat.Length;j++) //在当前无序区中选择最小的记录
{
if(mat[j]<mat[min])
min=j; //记录当前找到最小的关键字的下标
if(min!=i)
swap(i,min); //交换记录
}
}
}
public void swap(int i,int j)
{
int temp;
temp=mat[i];
mat[i]=mat[j];
mat[j]=temp;
}
public void output()
{
for(int i=0;i<mat.Length;i++)
Console.Write(mat[i]+" ");
Console.WriteLine();
}
public static void Main()
{
Random rom = new Random();
int[] table = new int[10];
for(int i=0;i<table.Length;i++)
table[i]=rom.Next(1,99); //生成随数放入数组。
mySelectSort mss=new mySelectSort(table);
mss.output();
mss.selectSort();
mss.output();
}
}
4.2堆排序
书上说学习树那一章才有。我也看完树再补吧。
(时间到了4.15日,可以补上这部分了)
将堆序列理解成,二叉树中,任意一个节点的关键字值都小于或等于它的子女节点的关键值。由此,根节点具有最小值,这种堆为小顶堆。
思路:用筛选法将一个待排序的数据元素序列建成堆,得到最小值---根节点的值。将跟节点值向后交换,再将余下的值调整成堆,重复进行,直到排序完成。
步骤:1.将数据元素序列看成是一棵完全二叉树节点的层次序列,此时它不具有堆得特性。
2.将这棵完全二叉树调整成堆。
3.将一棵子树调整成堆。
4.重复上一步,从下向上依次将子树调整成堆。
5.这时根节点的值最小,将跟节点交换到最后的位置,再将序列的前n-1个元素调整成堆。
6.重复上一步,将子序列调整成堆,知道子序列列长度为1,堆排序完成。
描述:
算法:
Code
using System;
public class myHeapSort
{
private int[] mat;
public myHeapSort(int[] table)
{
mat=new int[table.Length];
table.CopyTo(mat,0); //数组拷贝
}
public void output()
{
for(int i=0;i<mat.Length;i++)
Console.Write(mat[i]+" ");
Console.WriteLine();
}
public void heapSort()
{
int j;
for(j=mat.Length/2;j>0;j--) //建堆
sift(j,mat.Length-1);
for(j=mat.Length-1;j>0;j--) //调整堆
{
swap(1,j); //根最小值交换到后面
sift(1,j-1);
}
}
public void sift(int left,int right) //将以第left个元素为跟节点的子树调整成堆
{
int i,j,x;
i=left;
j=2*i; //第j个元素是第i个元素的左孩子
x=mat[i]; //获取第i个元素的值
while(j<=right)
{
if(j<right && mat[j]>mat[i])
j++; //如果有孩子值较小时,j表示右孩子
if(x>mat[j])
{
mat[i]=mat[j]; //设置第i个元素为j的值
i=j; //i、j向下滑动一层
j=2*i;
}
else
j=right+1;
}
mat[i]=x;
Console.Write(left+"~"+right+" ");
output();
}
public void swap(int i,int j)
{
int temp;
temp=mat[i];
mat[i]=mat[j];
mat[j]=temp;
}
public static void Main()
{
/*
Random rom = new Random();
int[] mat = new int[10];
for(int i=0;i<mat.Length;i++)
mat[i]=rom.Next(1,99); //生成随数放入数组。
*/
int[] mat = {0,5,3,7,4,6,8,2,1};
Console.WriteLine(mat.Length);
myHeapSort mhs = new myHeapSort(mat);
mhs.output();
mhs.heapSort();
mhs.output();
}
}