1、10种排序法冒泡选择插入希尔归并快速堆拓扑基数锦标赛排序各种排序算法总结排序算法有很多,所以在特定情景中使用哪一种算法很重要。为了选择合适的算法,可以按照建议的顺序考虑以下标准:(1)执行时间(2)存储空间(3)编程工作对于数据量较小的情形,(1)(2)差别不大,主要考虑(3);而对于数据量大的,(1)为首要。主要排序法有:一、冒泡(Bubble)排序相邻交换二、选择排序每次最小/大排在相应的位置三、插入排序将下一个插入已排好的序列中四、壳(Shell)排序缩小增量五、归并排序六、快速排序七、堆排序八、拓扑排序九、锦标赛排序十、基数排序一、冒泡(Bubble)排序-Code 从小到大排序n个数
2、-void BubbleSortArray() for(int i=1;in;i+) for(int j=0;iaj+1)/比较交换相邻元素 int temp; temp=ai; aj=aj+1; aj+1=temp; -Code-效率 O(n),适用于排序小列表。二、选择排序-Code 从小到大排序n个数-void SelectSortArray() int min_index; for(int i=0;in-1;i+) min_index=i; for(int j=i+1;jn;j+)/每次扫描选择最小项 if(arrjarrmin_index) min_index=j; if(min_i
3、ndex!=i)/找到最小项交换,即将这一项移到列表中的正确位置 int temp; temp=arri; arri=arrmin_index; arrmin_index=temp;-Code-效率O(n),适用于排序小的列表。三、插入排序-Code 从小到大排序n个数-void InsertSortArray()for(int i=1;i=0 & arrjtemp)/*将temp与已排序元素从小到大比较,寻找temp应插入的位置*/ arrj+1=arrj; j-;arrj+1=temp;-Code-最佳效率O(n);最糟效率O(n)与冒泡、选择相同,适用于排序小列表若列表基本有序,则插入排
4、序比冒泡、选择更有效率。四、壳(Shell)排序缩小增量排序-Code 从小到大排序n个数-void ShellSortArray() for(int incr=3;incr0;incr-)/增量递减 for(int L=0;L(n-1)/incr;L+)/重复分成的每个子列表 for(int i=L+incr;i=0&arrjtemp) arrj+incr=arrj; j-=incr;arrj+incr=temp;-Code-适用于排序小列表。效率估计O(nlog2n)O(n1.5),取决于增量值的最初大小。建议使用质数作为增量值,因为如果增量值是2的幂,则在下一个通道中会再次比较相同的元素
5、。壳(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;/新建一个数组,用于存放归
6、并的元素 for(int i=low,j=mid+1,k=low;i=mid & j=high;k+)/*两个子列表进行排序归并,直到两个子列表中的一个结束*/ if (arri=arrj;) Bk=arri; I+;else Bk=arrj; j+; for( ;j=high;j+,k+)/如果第二个子列表中仍然有元素,则追加到新列表 Bk=arrj; for( ;i=mid;i+,k+)/如果在第一个子列表中仍然有元素,则追加到新列表中 Bk=arri; for(int z=0;zhigh-low+1;z+)/将排序的数组B的 所有元素复制到原始数组arr中 arrz=Bz;-Code-效
7、率O(nlogn),归并的最佳、平均和最糟用例效率之间没有差异。适用于排序大列表,基于分治法。六、快速排序-Code-/*快速排序的算法思想:选定一个枢纽元素,对待排序序列进行分割,分割之后的序列一个部分小于枢纽元素,一个部分大于枢纽元素,再对这两个分割好的子序列进行上述的过程。*/ void swap(int a,int b)int t;t =a ;a =b ;b =t ; int Partition(int arr,int low,int high) int pivot=arrlow;/采用子序列的第一个元素作为枢纽元素 while (low high) /从后往前栽后半部分中寻找第一个小
8、于枢纽元素的元素 while (low = pivot) -high; /将这个比枢纽元素小的元素交换到前半部分 swap(arrlow, arrhigh); /从前往后在前半部分中寻找第一个大于枢纽元素的元素 while (low high &arr low =pivot ) +low ; swap (arr low ,arr high );/将这个枢纽元素大的元素交换到后半部分 return low ;/返回枢纽元素所在的位置 void QuickSort(int a,int low,int high) if (low high ) int n=Partition (a ,low ,hig
9、h ); 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)若jkj,则令jj1,否则j不变;(5)比较temp和kj,若kjtemp,则令ki等于kj,并令i=j,j=2i+1,并转(3),否则转(6)(6)令ki等于temp,结束。-Code-void HeapSort(SeqIAst R) /对R1.n进行堆排序,不妨用R0做暂存单元 int I; BuildHeap(R); /将R1-n建成初始堆for(i=n;i1;i-) /对当前无序区R1.i进行堆排序,共做n-1趟。 R0=R1; R1=Ri; Ri=R0; /将堆顶和堆中最后一个记录交换 Heapify(R,1,i-1); /将R1.i-1重新调整为堆,仅有R1可能违反堆性质
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1