排序方法.docx
- 文档编号:3623715
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:15
- 大小:19.99KB
排序方法.docx
《排序方法.docx》由会员分享,可在线阅读,更多相关《排序方法.docx(15页珍藏版)》请在冰豆网上搜索。
排序方法
排序方法
一、需求分析
排序是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个相知有序的序列。
排序分为两类:
内排序和外排序。
内部排序是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列。
其中快速排序的是目前排序方法中被认为是最好的方法。
内部排序方法:
1.插入排序(直接插入排序);
2.快速排序;
3.选择排序(简单选择排序);
4.归并排序;
5.冒泡排序;
6.希尔排序;
希尔排序是对直接插入排序方法的改进。
7.堆排序;
二、概要设计
1.直接插入排序(StraihtInsertionSort)
算法描述:
如果有一个已经排好序的序列{R(20),R(35),R(88)},当要插入一个R(66)时,需要与各个元素进行比较,R(35) 算法开始时,取一个元素为原序列,然后重复执行上面的方法,将每个元素插入到序列中。 (1).直接插入排序(StraihtInsertionSort) 算法描述: 如果有一个已经排好序的序列{R(20),R(35),R(88)},当要插入一个R(66)时,需要与各个元素进行比较,R(35) 算法开始时,取一个元素为原序列,然后重复执行上面的方法,将每个元素插入到序列中。 //插入排序 voidInsertSort(inta[],intn) { inti,j; inttemp; for(i=1;i { temp=a[i]; j=i-1; while(j>=0&&a[j]>temp;) { a[j+1]=a[j]; --j; } a[j+1]=temp; } } //递归的插入排序 voidRecursiveInsertSort(inta[],intn) { inti,j,key; if(n>1) { RecursiveInsertSort(a,n-1); } key=a[n-1]; i=n-2; while(i>=0&&a[i]>key) { a[i+1]=a[i]; i--; } a[i+1]=key; } //折半插入排序 voidBinInsertSort(inta[],intn) { inti,j; for(i=1;i { //在a[0..i-1]中折半查找插入位置使a[high]<=a[i] intlow=0,high=i-1,m=0; while(low<=high) { m=m+(high-low)/2; if(a[i] elselow=m+1; } //向后移动元素a[high+1..i-1],在a[high+1]处插入a[i] intx=a[i]; for(j=i-1;j>high;j--) a[j+1]=a[j]; a[high+1]=x;//完成插入 } } 此算法的时间复杂度为O(n2) 2.快速排序 快速排序是一种基于交换的排序方法,最常见的有冒泡排序(BubbleSort),快速排序(改进的冒泡排序)(QuickSort) 下面先说冒泡排序: 冒泡排序的基本思想是在一次排序中,将最大的元素沉入底部,然后缩小范围,继续进行。 具体的说: 取第一个元素,然后与第二个元素进行比较,如果比第二个大,那么交换,否则,不交换,然后取第二个元素与第三个元素比较,同样用前面的方法,大则交换,直到将最大的元素交换到最底部,这是第一遍排序结束,然后,缩小范围,从第二个元素开始,在此运用上面的一遍排序方法。 直到范围缩小为一个元素的时候,排序结束。 快速排序是不稳定的。 最理想情况算法时间复杂度O(nlog2n),最坏O(n^2)。 //快速排序 voidQuickSort(inta[],intlow,inthigh) { if(low { //划分 intpivot=a[low]; inti=low;intj=high; while(i { while(i a[i]=a[j]; while(i a[j]=a[i]; } a[i]=pivot; //对子序列快排 QuickSort(a,low,i-1); QuickSort(a,i+1,high); } } //快速排序法的划分操作 intPartition(intvec[],intlow,inthigh) { //任选元素作为轴,这里选首元素 intpivot=vec[low]; while(low { while(low high--; vec[low]=vec[high]; while(low low++; vec[high]=vec[low]; } //此时low==high vec[low]=pivot; returnlow; } //in-placepartitionalgorithm intin_place_partition(int*array,intleft,intright) { intpivot_index=(right-left)/2; intpivot=array[pivot_index]; swap(array[pivot_index],array[right]); intindex=left; for(inti=left;i { if(array[i] { swap(array[index],array[i]); ++index; } } swap(array[right],array[index]); returnindex; } voidQsort(int*array,intleft,intright) { if(left>=right) return; intindex=Partition(array,left,right); Qsort(array,left,index-1); Qsort(array,index+1,right); } 3.选择排序 选择排序(SelectionSort)的基本思想是,每一趟排序在n-i+1(i=1,2,3....,n-1)中选取关键字最小的记录作为有序序列的第i个记录。 (1)最为简单的是简单选择排序(SampleSelectionsort) //选择排序 voidSelectSort(inta[],intn) { inttemp; inti,j;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序 方法