排序算法集合 联系客服

发布时间 : 星期日 文章排序算法集合更新完毕开始阅读4a37d1e3caaedd3382c4d336

If(L[i]

Temp[0][n]=L[i]; Else

Lsp=(L[i]/m); //确定关键字 Temp[lsp][n]=L[i]; n++; }

CollectElement(L,Temp); //收集 n=0; m=m*10; k++; } }

10种排序算法总结

2011-09-20 12:01:17 我来说两句

收藏

我要投稿

排序算法有很多,所以在特定情景中使用哪一种算法很重要。为了选择合适的算法,可以按照建议的顺序考虑以下标准: (1)执行时间 (2)存储空间 (3)编程工作

对于数据量较小的情形,(1)(2)差别不大,主要考虑(3);而对于数据量大的,(1)为首要。

主要排序法有:

一、冒泡(Bubble)排序——相邻交换 二、选择排序——每次最小/大排在相应的位置 三、插入排序——将下一个插入已排好的序列中 四、壳(Shell)排序——缩小增量 五、归并排序 六、快速排序 七、堆排序 八、拓扑排序 九、锦标赛排序 十、基数排序

一、冒泡(Bubble)排序

----------------------------------Code 从小到大排序n个数------------------------------------ void BubbleSortArray() {

for(int i=1;i

for(int j=0;i

if(a[j]>a[j+1])//比较交换相邻元素 {

int temp;

temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } }

-------------------------------------------------Code------------------------------------------------

效率 O(n2),适用于排序小列表。

二、选择排序

----------------------------------Code 从小到大排序n个数-------------------------------- void SelectSortArray() {

int min_index; for(int i=0;i

min_index=i;

for(int j=i+1;j

if(min_index!=i)//找到最小项交换,即将这一项移到列表中的正确位置 {

int temp;

temp=arr[i]; arr[i]=arr[min_index]; arr[min_index]=temp; } } }

-------------------------------------------------Code-----------------------------------------

效率O(n2),适用于排序小的列表。

三、插入排序

--------------------------------------------Code 从小到大排序n个数------------------------------------- void InsertSortArray() {

for(int i=1;i

int temp=arr[i];//temp标记为未排序第一个元素 int j=i-1;

while (j>=0 && arr[j]>temp)/*将temp与已排序元素从小到大比较,寻找temp应插入的位置*/ {

arr[j+1]=arr[j]; j--; }

arr[j+1]=temp; } }

------------------------------Code--------------------------------------------------------------

最佳效率O(n);最糟效率O(n2)与冒泡、选择相同,适用于排序小列表 若列表基本有序,则插入排序比冒泡、选择更有效率。

四、壳(Shell)排序——缩小增量排序

-------------------------------------Code 从小到大排序n个数------------------------------------- void ShellSortArray() {

for(int incr=3;incr<0;incr--)//增量递减,以增量3,2,1为例 {

for(int L=0;L<(n-1)/incr;L++)//重复分成的每个子列表 {

for(int i=L+incr;i

int temp=arr[i]; int j=i-incr;

while(j>=0&&arr[j]>temp) {

arr[j+incr]=arr[j]; j-=incr; }

arr[j+incr]=temp; } } } }

--------------------------------------Code-------------------------------------------

适用于排序小列表。

效率估计O(nlog2^n)~O(n^1.5),取决于增量值的最初大小。建议使用质数作为增量值,因为如果增量值是2的幂,则在下一个通道中会再次比较相同的元素。

壳(Shell)排序改进了插入排序,减少了比较的次数。是不稳定的排序,因为排序过程中元素可能会前后跳跃。

五、归并排序

----------------------------------------------Code 从小到大排序--------------------------------------- void MergeSort(int low,int high) {

if(low>=high) return;//每个子列表中剩下一个元素时停止

else int mid=(low+high)/2;/*将列表划分成相等的两个子列表,若有奇数个元素,则在左边子列表大于右侧子列表*/

MergeSort(low,mid);//子列表进一步划分 MergeSort(mid+1,high);

int [] B=new int [high-low+1];//新建一个数组,用于存放归并的元素

for(int i=low,j=mid+1,k=low;i<=mid && j<=high;k++)/*两个子列表进行排序归并,直到两个子列表中的一个结束*/ {

if (arr[i]<=arr[j];) {

B[k]=arr[i]; I++;