快速排序的最坏运行情况是 O(n?) , 比如说顺序数列的快排 。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很?。?比复杂度稳定等于 O(nlogn) 的归并排序要小很多 。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序 。
1. 算法步骤
从数列中挑出一个元素,称为 "基准"(pivot);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边) 。在这个分区退出之后,该基准就处于数列的中间位置 。这个称为分区(partition)操作;
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
2. 动图演示
代码实现JavaScript实例functionquickSort ( arr ,left ,right ){
varlen=arr. length,
partitionIndex ,
left=typeofleft!='number'?0:left ,
right=typeofright!='number'?len-1:right ;
if( left
写一个简单的JAVA排序程序//排序
public class Array
{
public static int[] random(int n)//产生n个随机数,返回整型数组
{
if (n0)
{
int table[] = new int[n];
for (int i=0; itable.length; i++)
table[i] = (int)(Math.random()*100);//产生一个0~100之间的随机数
return table;//返回一个数组
}
return null;
}
public static void print(int[] table)//输出数组元素
{
if (table!=null)
for (int i=0; itable.length; i++)
System.out.print(" "+table[i]);
System.out.println();
}
public static void insertSort(int[] table)//直接插入排序
{//数组是引用类型,元素值将被改变
System.out.println("直接插入排序");
for (int i=1; itable.length; i++)//n-1趟扫描
{
int temp=table[i], j;//每趟将table[i]插入到前面已排序的序列中
//System.out.print("移动");
for (j=i-1; j-1temptable[j]; j--)//将前面较大元素向后移动
{
//System.out.print(table[j]+", ");
table[j+1] = table[j];
}
table[j+1] = temp;//temp值到达插入位置
System.out.print("第"+i+"趟: ");
print(table);
}
}
public static void shellSort(int[] table)//希尔排序
{
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+"趟: ");
推荐阅读
- canvas游戏开发思维,canvas做游戏
- 抖音手机壁纸怎么去除字,苹果手机抖音没有动态壁纸选项
- apex竞速游戏怎么开启,apex怎么开启帧数
- js对象数组去重,js数组中的对象去重合并
- mysql表误删怎么办 mysql不小心删除了表
- chatgpt无效的url,chatGPT授权码无效
- asp.net获取当前窗口,aspnet弹出窗口选择
- 蓬安天然气关注公众号,蓬安天然气电话
- php列出数据库中图片 php读取图片并输出