10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序Word下载.docx
- 文档编号:15061797
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:17
- 大小:49.88KB
10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序Word下载.docx
《10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序Word下载.docx》由会员分享,可在线阅读,更多相关《10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
voidBubbleSortArray()
{
for(inti=1;
i<
n;
i++)
{
for(intj=0;
n-i;
j++)
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;
n-1;
min_index=i;
for(intj=i+1;
j<
j++)//每次扫描选择最小项
if(arr[j]<
arr[min_index])min_index=j;
if(min_index!
=i)//找到最小项交换,即将这一项移到列表中的正确位置
temp=arr[i];
arr[i]=arr[min_index];
arr[min_index]=temp;
-------------------------------------------------Code------------------------------------------------------
效率O(n²
),适用于排序小的列表。
三、插入排序
--------------------------------------------Code从小到大排序n个数-------------------------------------
voidInsertSortArray()
for(inti=1;
i++)//循环从第二个数组元素开始,因为arr[0]作为最初已排序部分
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+=incr)//对每个子列表应用插入排序
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;
=mid&
j<
=high;
k++)/*两个子列表进行排序归并,直到两个子列表中的一个结束*/
if(arr[i]<
=arr[j];
)
B[k]=arr[i];
I++;
else
{B[k]=arr[j];
j++;
for(;
j++,k++)//如果第二个子列表中仍然有元素,则追加到新列表
B[k]=arr[j];
for(;
=mid;
i++,k++)//如果在第一个子列表中仍然有元素,则追加到新列表中
for(intz=0;
z<
high-low+1;
z++)//将排序的数组B的所有元素复制到原始数组arr中
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<
high)
//从后往前栽后半部分中寻找第一个小于枢纽元素的元素
high&
arr[high]>
=pivot)
--high;
//将这个比枢纽元素小的元素交换到前半部分
swap(arr[low],arr[high]);
//从前往后在前半部分中寻找第一个大于枢纽元素的元素
high&
arr[low]<
=pivot)
++low;
swap(arr[low],arr[high]);
//将这个枢纽元素大的元素交换到后半部分
returnlow;
//返回枢纽元素所在的位置
voidQuickSort(int[]a,intlow,inthigh)
if(low<
high)
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]可能违反堆性质
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 排序 冒泡 选择 插入 希尔 归并 快速 拓扑 基数 锦标赛
![提示](https://static.bdocx.com/images/bang_tan.gif)