内部排序算法实现C#语言.docx
- 文档编号:5160264
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:14
- 大小:17.32KB
内部排序算法实现C#语言.docx
《内部排序算法实现C#语言.docx》由会员分享,可在线阅读,更多相关《内部排序算法实现C#语言.docx(14页珍藏版)》请在冰豆网上搜索。
内部排序算法实现C#语言
这里将介绍几种常见的内部排序算法,包括:
直接插入排序、二分查找插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序。
假设待排序的对象是整型数组,排序操作直接在数组上进行。
下面直接上代码及相应注释。
///
///各种排序算法实现
///
classInnerSortAlgorithm
{
///
///直接插入排序算法。
///
///往已经排好序的序列中插入待排元素,在查找待排元素位置时顺便进行元素移动。
///
///
///
publicvoidInnerSort_DirectInsert(int[]iArr)
{
intlen=iArr.Length;
inttempI;
intj;
for(inti=1;i { tempI=iArr[i]; j=i-1; while(j>=0&&iArr[j]>tempI) { iArr[j+1]=iArr[j]; j--; } iArr[j+1]=tempI; } } /// ///二分查找插入排序。 /// ///在已排好序的序列中插入元素,插入位置通过二分查找获得。 /// /// /// publicvoidInnerSort_BinaryInsert(int[]iArr) { intlen=iArr.Length; intpos; inttempI; for(inti=1;i { tempI=iArr[i]; pos=FindInsertPosition(iArr,i-1,tempI);//查找待插入位置 for(intj=i;j>pos;j--) { iArr[j]=iArr[j-1]; } iArr[pos]=tempI; } } /// ///二分查找确定待插入位置。 /// /// /// /// /// privateintFindInsertPosition(int[]iArr,intendPos,inttempI) { intstartPos=0; intmidPos; while(startPos<=endPos) { midPos=(startPos+endPos)/2; if(iArr[midPos]>tempI) { endPos=midPos-1; } else { startPos=midPos+1; } } returnstartPos; } /// ///希尔排序算法。 /// ///分组插入排序,按一定间隔先将序列分成n组,组内进行直接插入排序,再减小间隔直至1,完成排序。 /// /// /// publicvoidInnerSort_Shell(int[]iArr) { intlen=iArr.Length; intinterval=len/2; inttempI; intj; while(interval>=1) { for(inti=interval;i { tempI=iArr[i]; j=i-interval; while(j>=0&&iArr[j]>tempI) { iArr[j+interval]=iArr[j]; j-=interval; } iArr[j+interval]=tempI; } interval/=2; } } /// ///选择排序算法。 /// ///每一次都是在待排序列中选出最小的元素,将其放置于有序序列之后。 /// /// /// publicvoidInnerSort_Selection(int[]iArr) { intlen=iArr.Length; intpos; intmin; for(inti=0;i { pos=i; min=iArr[i]; for(intj=i+1;j { if(iArr[j] { pos=j; min=iArr[j]; } } if(pos! =i) { Swap(iArr,pos,i); } } } /// ///交换数组中两个不同位置的元素。 /// /// /// /// privatevoidSwap(int[]iArr,intpos1,intpos2) { if(pos1! =pos2) { iArr[pos1]^=iArr[pos2]; iArr[pos2]^=iArr[pos1]; iArr[pos1]^=iArr[pos2]; } } /// ///(大顶)堆排序算法。 /// ///大顶堆特点: 父节点元素均不小于子节点元素。 /// /// ///构建大顶堆,将堆顶元素与堆中最后一个元素调换,然后在剩余元素中重新构建大顶堆,重复该过程。 /// /// /// publicvoidInnerSort_Heap(int[]iArr) { intlen=iArr.Length; if(len>1) { ConstructMaxHeap(iArr,len-1);//先将原数组构建成一个大顶堆 Swap(iArr,0,len-1); for(inti=0;i { AdjustMaxHeap(iArr,0,len-2-i);//将数组剩余部分重新调整成大顶堆 Swap(iArr,0,len-2-i); } } } /// ///将给定元素序列构建成大顶堆。 /// ///从堆中最后一个元素的父节点开始调整,使该节点以下部分成为大顶堆,然后一直调整到根节点。 /// /// /// /// privatevoidConstructMaxHeap(int[]iArr,intlastPos) { for(inti=(lastPos-1)/2;i>=0;i--) { AdjustMaxHeap(iArr,i,lastPos); } } /// ///调整除堆顶位置外,其他位置均符合大顶堆性质的堆为大顶堆。 /// /// /// /// privatevoidAdjustMaxHeap(int[]iArr,intstartPos,intlastPos) { intleftChild; intlargePos; while(startPos*2+1<=lastPos) { leftChild=startPos*2+1; largePos=leftChild; if(leftChild+1<=lastPos&&iArr[leftChild] { largePos=leftChild+1; } if(iArr[startPos] { Swap(iArr,startPos,largePos); startPos=largePos; } else { break; } } } /// ///冒泡排序算法。 /// ///每次比较相邻两个元素,将较大元素往后移 /// /// /// publicvoidInnerSort_Bubble(int[]iArr) { intlen=iArr.Length; /*boolisFinish;//额外设计一个标志,判断是否已经排序完 for(inti=len-1;i>0;i--) { isFinish=true; for(intj=0;j { if(iArr[j]>iArr[j+1]) { Swap(iArr,j,j+1); isFinish=false; } } if(isFinish) { break; } }*/ intlastPos; inti=len-1; while(i>0) { lastPos=0; for(intj=0;j { if(iArr[j]>iArr[j+1]) { Swap(iArr,j,j+1); lastPos=j; } } i=lastPos; } } /// ///快速排序算法。 /// ///先选择一个枢轴元素,以该元素为基准将序列划分成两部分,前半部分元素值均小于枢轴元素, ///后半部分均大于,然后递归处理前后两部分。 /// /// /// publicvoidInnerSort_Quick(int[]iArr) { QSort(iArr,0,iArr.Length-1); } /// ///通过递归实现给定起始位置和末尾位置序列的快速排序。 /// /// /// /// privatevoidQSort(int[]iArr,intstartPos,intendPos) { if(startPos { intpivotPos=Partition(iArr,startPos,endPos);//进行一次划分 QSort(iArr,startPos,pivotPos-1); QSort(iArr,pivotPos+1,endPos); } } /// ///获取枢轴元素在序列划分后的位置。 /// ///划分过程中同时将相应元素进行移动,枢轴元素只在最终确实位置时移动。 /// /// /// /// /// /// privateintPartition(int[]iArr,intstartPos,intendPos) { inttempI=iArr[startPos]; while(startPos { while(startPos { endPos--; } iArr[startPos]=iArr[endPos]; while(startPos { startPos++; } iArr[endPos]=iArr[startPos]; } iArr[startPos]=tempI; returnstartPos; } /// ///归并排序算法。 /// ///将待排序序列分成两个有序序列,进而合并两个有序序列为一个有序序列。 /// /// ///对于划分出的序列进行排序,可递归实现。 /// /// /// publicvoidInnerSort_Merge(int[]iArr) { MSort(iArr,0,iArr.Length-1); } /// ///通过递归实现给定起始位置和末尾位置序列的归并排序。 /// /// /// /// privatevoidMSort(int[]iArr,intstartPos,intendPos) { if(startPos { intmidPos=(startPos+endPos)/2; MSort(iArr,startPos,midPos); MSort(iArr,midPos+1,endPos); Merge(iArr,startPos,midPos,endPos); } } /// ///合并两个有序序列。 /// /// /// /// /// privatevoidMerge(int[]iArr,intstartPos,intmidPos,intendPos) { int[]tempArr=newint[endPos-startPos+1]; intpos=0; inti=startPos; intj=midPos+1; while(i<=midPos&&j<=endPos) { if(iArr[i]<=iArr[j]) { tempArr[pos]=iArr[i]; i++; } else { tempArr[pos]=iArr[j]; j++; } pos++; } while(i<=midPos) { tempArr[pos]=iArr[i]; i++; pos++; } while(j<=endPos) { tempArr[pos]=iArr[j]; j++; pos++; } for(i=0;i { iArr[startPos+i]=tempArr[i]; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内部 排序 算法 实现 C# 语言