十种排序算法比较.docx
- 文档编号:6551506
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:6
- 大小:16.25KB
十种排序算法比较.docx
《十种排序算法比较.docx》由会员分享,可在线阅读,更多相关《十种排序算法比较.docx(6页珍藏版)》请在冰豆网上搜索。
十种排序算法比较
十种排序算法比较
排序算法有很多,所以在特定情景中使用哪一种算法很重要。
为了选择合适的算法,可以按照建议的顺序考虑以下标准:
(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[j];a[j]=a[j+1];a[j+1]=temp; } } } } -------------------------------------------------Code------------------------------------------------ 效率O(n2),适用于排序小列表。 二、选择排序 ----------------------------------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(n2),适用于排序小的列表。 三、插入排序 --------------------------------------------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(n2)与冒泡、选择相同,适用于排序小列表 若列表基本有序,则插入排序比冒泡、选择更有效率。 四、壳(Shell)排序——缩小增量排序 -------------------------------------Code从小到大排序n个数------------------------------------- voidShellSortArray() { for(intincr=3;incr<0;incr--)//增量递减,以增量3,2,1为例 { 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 { --high; } //将这个比枢纽元素小的元素交换到前半部分 swap(arr[low],arr[high]); //从前往后在前半部分中寻找第一个大于枢纽元素的元素 while(low { ++low; } swap(arr[low],arr[high]);//将这个枢纽元素大的元素交换到后半部分 } returnlow;//返回枢纽元素所在的位置
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序 算法 比较