10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序.docx

上传人:b****2 文档编号:2143757 上传时间:2022-10-27 格式:DOCX 页数:17 大小:49.88KB
下载 相关 举报
10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序.docx_第1页
第1页 / 共17页
10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序.docx_第2页
第2页 / 共17页
10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序.docx_第3页
第3页 / 共17页
10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序.docx_第4页
第4页 / 共17页
10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序.docx

《10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序.docx》由会员分享,可在线阅读,更多相关《10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序.docx(17页珍藏版)》请在冰豆网上搜索。

10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序.docx

10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序

各种排序算法总结

排序算法有很多,所以在特定情景中使用哪一种算法很重要。

为了选择合适的算法,可以按照建议的顺序考虑以下标准:

(1)执行时间

(2)存储空间

(3)编程工作

对于数据量较小的情形,

(1)

(2)差别不大,主要考虑(3);而对于数据量大的,

(1)为首要。

主要排序法有:

一、冒泡(Bubble)排序——相邻交换

二、选择排序——每次最小/大排在相应的位置

三、插入排序——将下一个插入已排好的序列中

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

五、归并排序

六、快速排序

七、堆排序

八、拓扑排序

九、锦标赛排序

十、基数排序

一、冒泡(Bubble)排序

----------------------------------Code从小到大排序n个数------------------------------------

voidBubbleSortArray()

{

for(inti=1;i

{

for(intj=0;i

{

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

{

inttemp;

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

}

}

}

}

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

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

二、选择排序

----------------------------------Code从小到大排序n个数--------------------------------

voidSelectSortArray()

{

intmin_index;

for(inti=0;i

{

min_index=i;

for(intj=i+1;j

if(arr[j]

if(min_index!

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

{

inttemp;

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

}

}

}

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

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

三、插入排序

--------------------------------------------Code从小到大排序n个数-------------------------------------

voidInsertSortArray()

{

for(inti=1;i

{

inttemp=arr[i];//temp标记为未排序第一个元素

intj=i-1;

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

{

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

j--;

}

arr[j+1]=temp;

}

}

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

最佳效率O(n);最糟效率O(n²)与冒泡、选择相同,适用于排序小列表

若列表基本有序,则插入排序比冒泡、选择更有效率。

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

-------------------------------------Code从小到大排序n个数-------------------------------------

voidShellSortArray()

{

for(intincr=3;incr<0;incr--)//增量递减

{

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

{

for(inti=L+incr;i

{

inttemp=arr[i];

intj=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从小到大排序---------------------------------------

voidMergeSort(intlow,inthigh)

{

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

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

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

MergeSort(mid+1,high);

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

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

{

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

{

B[k]=arr[i];

I++;

}

else

{B[k]=arr[j];j++;}

}

for(;j<=high;j++,k++)//如果第二个子列表中仍然有元素,则追加到新列表

B[k]=arr[j];

for(;i<=mid;i++,k++)//如果在第一个子列表中仍然有元素,则追加到新列表中

B[k]=arr[i];

for(intz=0;z

arr[z]=B[z];

}

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

效率O(nlogn),归并的最佳、平均和最糟用例效率之间没有差异。

适用于排序大列表,基于分治法。

六、快速排序

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

/*快速排序的算法思想:

选定一个枢纽元素,对待排序序列进行分割,分割之后的序列一个部分小于枢纽元素,一个部分大于枢纽元素,再对这两个分割好的子序列进行上述的过程。

*/voidswap(inta,intb){intt;t=a;a=b;b=t;}

intPartition(int[]arr,intlow,inthigh)

{

intpivot=arr[low];//采用子序列的第一个元素作为枢纽元素

while(low

{

//从后往前栽后半部分中寻找第一个小于枢纽元素的元素

while(low=pivot)

{

--high;

}

//将这个比枢纽元素小的元素交换到前半部分

swap(arr[low],arr[high]);

//从前往后在前半部分中寻找第一个大于枢纽元素的元素

while(low

{

++low;

}

swap(arr[low],arr[high]);//将这个枢纽元素大的元素交换到后半部分

}

returnlow;//返回枢纽元素所在的位置

}

voidQuickSort(int[]a,intlow,inthigh)

{

if(low

{

intn=Partition(a,low,high);

QuickSort(a,low,n);

QuickSort(a,n+1,high);

}

}

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

平均效率O(nlogn),适用于排序大列表。

此算法的总时间取决于枢纽值的位置;选择第一个元素作为枢纽,可能导致O(n²)的最糟用例效率。

若数基本有序,效率反而最差。

选项中间值作为枢纽,效率是O(nlogn)。

基于分治法。

七、堆排序

最大堆:

后者任一非终端节点的关键字均大于或等于它的左、右孩子的关键字,此时位于堆顶的节点的关键字是整个序列中最大的。

思想:

(1)令i=l,并令temp=kl;

(2)计算i的左孩子j=2i+1;

(3)若j<=n-1,则转(4),否则转(6);

(4)比较kj和kj+1,若kj+1>kj,则令j=j+1,否则j不变;

(5)比较temp和kj,若kj>temp,则令ki等于kj,并令i=j,j=2i+1,并转(3),否则转(6)

(6)令ki等于temp,结束。

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

voidHeapSort(SeqIAstR)

{//对R[1..n]进行堆排序,不妨用R[0]做暂存单元

intI;

BuildHeap(R);//将R[1-n]建成初始堆

for(i=n;i>1;i--)//对当前无序区R[1..i]进行堆排序,共做n-1趟。

{

R[0]=R[1];R[1]=R[i];R[i]=R[0];//将堆顶和堆中最后一个记录交换

Heapify(R,1,i-1);//将R[1..i-1]重新调整为堆,仅有R[1]可能违反堆性质

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 演讲主持

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1