排序的几种算法

本文介绍了五种常见的排序算法:插入排序、选择排序、冒泡排序、快速排序和堆排序,并详细解析了每种算法的工作原理及适用场景。此外,还讨论了不同情况下选择合适的排序算法的原则。

进行第四次交换后: 27       38  

 

一、插入排序(Insertion Sort)

  每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。

二、选择排序

  每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

 

三、冒泡排序(BubbleSort)

  两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。

 

四、快速排序(Quick Sort

  在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。

 

五、堆排序(Heap Sort)

  堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。

 

 

 

 

 

2. 小结:

(1) n较小(n <= 50),则可以采用直接插入排序或直接选择排序。由于直接插入排序所需的记录移动操作较直接选择排序多,因而当记录本身信息量较大时,用直接选择排序较好。

(2) 若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。

(3) n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序。 快速排序是目前基于比较的内部排序法中被认为是最好的方法。

(4) 在基于比较排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程,由此可以证明:当文件的n个关键字随机分布时,任何借助于"比较"的排序算法,至少需要O(nlog2n)的时间。

(5) 当记录本身信息量较大时,为避免耗费大量时间移动记录,可以用链表作为存储结构。

 

 

 

 

 

 

冒泡排序

using system


namespace bubblesorter
{
public class bubblesorter
{
public void sort
int [] list

{
int i,j,temp

bool done=false

j=1

while
((jlist.length&&!done))

{
done=true

for
i=0ilist.length-ji++

{
if
list[i]list[i+1]

{
done=false

temp=list[i]

list[i]=list[i+1]

list[i+1]=temp

}
}
j++

}


}
}
public class mainclass
{
public static void main
()

{
int[] iarrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47}

bubblesorter sh=new bubblesorter
();

sh.sort
iarrary);

for
int m=0miarrary.lengthm++

console.write
"{0} ",iarrary[m]);

console.writeline
();

}
}
}


  选择排序

  

using system



namespace selectionsorter
{
public class selectionsorter
{
private int min

public void sort
int [] list

{
for
int i=0ilist.length-1i++

{
min=i

for
int j=i+1jlist.lengthj++

{
if
list[j]list[min]

min=j

}
int t=list[min]

list[min]=list[i]

list[i]=t

}


}
}
public class mainclass
{
public static void main
()

{
int[] iarrary=new int[]{1,5,3,6,10,55,9,2,87,12,34,75,33,47}

selectionsorter ss=new selectionsorter
();

ss.sort
iarrary);

for
int m=0miarrary.lengthm++

console.write
"{0} ",iarrary[m]);

console.writeline
();



}
}
}


  插入排序


  
using system



namespace insertionsorter
{
public class insertionsorter
{
public void sort
int [] list

{
for
int i=1ilist.lengthi++

{
int t=list[i]

int j=i

while
((j0&&list[j-1]t))

{
list[j]=list[j-1]

--j

}
list[j]=t

}


}
}
public class mainclass
{
public static void main
()

{
int[] iarrary=new int[]{1,13,3,6,10,55,98,2,87,12,34,75,33,47}

insertionsorter ii=new insertionsorter
();

ii.sort
iarrary);

for
int m=0miarrary.lengthm++

console.write
"{0}",iarrary[m]);

console.writeline
();

}
}
}


  希尔排序


  
using system



namespace shellsorter
{
public class shellsorter
{
public void sort
int [] list

{
int inc

for
inc=1inc=list.length/9inc=3*inc+1);

for
(;inc0inc/=3

{
for
int i=inc+1i=list.lengthi+=inc

{
int t=list[i-1]

int j=i

while
((jinc&&list[j-inc-1]t))

{
list[j-1]=list[j-inc-1]

j-=inc

}
list[j-1]=t

}
}
}
}
public class mainclass
{
public static void main
()

{
int[] iarrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47}

shellsorter sh=new shellsorter
();

sh.sort
iarrary);

for
int m=0miarrary.lengthm++

console.write
"{0} ",iarrary[m]);

console.writeline
();

}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值