堆排序最优java代码 堆排序程序( 六 )


System.out.println("希尔排序");
for (int delta=table.length/2; delta0; delta/=2)//控制增量,增量减半 , 若干趟扫描
{
for (int i=delta; itable.length; i++)//一趟中若干组,每个元素在自己所属组内进行直接插入排序
{
int temp = table[i];//当前待插入元素
int j=i-delta;//相距delta远
while (j=0temptable[j])//一组中前面较大的元素向后移动
{
table[j+delta] = table[j];
j-=delta;//继续与前面的元素比较
}
table[j+delta] = temp;//插入元素位置
}
System.out.print("delta="+delta+"");
print(table);
}
}
private static void swap(int[] table, int i, int j)//交换数组中下标为i、j的元素
{
if (i=0itable.lengthj=0jtable.lengthi!=j)//判断i、j是否越界
{
int temp = table[j];
table[j] = table[i];
table[i] = temp;
}
}
public static void bubbleSort(int[] table)//冒泡排序
{
System.out.println("冒泡排序");
boolean exchange=true;//是否交换的标记
for (int i=1; itable.lengthexchange; i++)//有交换时再进行下一趟 , 最多n-1趟
{
exchange=false;//假定元素未交换
for (int j=0; jtable.length-i; j++)//一次比较、交换
if (table[j]table[j+1])//反序时,交换
{
int temp = table[j];
table[j] = table[j+1];
table[j+1] = temp;
exchange=true;//有交换
}
System.out.print("第"+i+"趟: ");
print(table);
}
}
public static void quickSort(int[] table)//快速排序
{
quickSort(table, 0, table.length-1);
}
private static void quickSort(int[] table, int low, int high) //一趟快速排序,递归算法
{//low、high指定序列的下界和上界
if (lowhigh)//序列有效
{
int i=low, j=high;
int vot=table[i];//第一个值作为基准值
while (i!=j)//一趟排序
{
while (ijvot=table[j])//从后向前寻找较小值
j--;
if (ij)
{
table[i]=table[j];//较小元素向前移动
i++;
}
while (ijtable[i]vot)//从前向后寻找较大值
i++;
if (ij)
{
table[j]=table[i];//较大元素向后移动
j--;
}
}
table[i]=vot;//基准值的最终位置
System.out.print(low+".."+high+",vot="+vot+"");
print(table);
quickSort(table, low, j-1);//前端子序列再排序
quickSort(table, i+1, high);//后端子序列再排序
}
}
public static void selectSort(int[] table)//直接选择排序
{
System.out.println("直接选择排序");
for (int i=0; itable.length-1; i++)//n-1趟排序
{//每趟在从table[i]开始的子序列中寻找最小元素
int min=i;//设第i个数据元素最小
for (int j=i+1; jtable.length; j++)//在子序列中查找最小值
if (table[j]table[min])
min = j;//记住最小元素下标
if (min!=i)//将本趟最小元素交换到前边
{
int temp = table[i];
table[i] = table[min];
table[min] = temp;
}
System.out.print("第"+i+"趟: ");
print(table);
}
}
private static void sift(int[] table, int low, int high) //将以low为根的子树调整成最小堆
{//low、high是序列下界和上界
int i=low;//子树的根
int j=2*i+1;//j为i结点的左孩子
int temp=table[i];//获得第i个元素的值
while (j=high)//沿较小值孩子结点向下筛选
{
if (jhightable[j]table[j+1])//数组元素比较(改成为最大堆)
j++;//j为左右孩子的较小者
if (temptable[j])//若父母结点值较大(改成为最大堆)
{
table[i]=table[j];//孩子结点中的较小值上移
i=j;//i、j向下一层
j=2*i+1;
}
else
j=high+1;//退出循环

推荐阅读