查找与排序
查找和排序都是程序中经常用到的算法
一、查找
查找分为:顺序查找,二分查找、哈希表查找和二叉树排序查找。
哈希表和二叉树查找的重点在于其数据结构。哈希表的主要优点是能够在O(1)的时间查找某一元素,是效率最高的查找方式。其缺点是需要额外的空间来实现哈希表。
二、排序
排序分为插入排序,交换排序,选择排序归并排序等。排序的这几种方法的优劣(额外空间的消耗,平均时间复杂度和最差时间复杂度)、特点是重点。
1.插入排序
a.直接插入
当给定的数据元素序列有序时,关键字之间比较次数最少,最好的情况下时间复杂度为O(N),最差的情况下为O(N^2)
voidInSertSort(int*a,intlength){for(inti=1;i<length;i++){inttmp=a[i];intj=0;for(j=i-1;j>=0&&tmp<a[j];j--)//当后面无序的元素小于有序的元素时,将那个有序的元素到要排序的这个元素整体后移后移{a[j+1]=a[j];}a[j+1]=tmp;}}
插入排序是最稳定的排序方法
b.折半插入
和直接插入排序过程相似,用折半的方法寻找插入位置。
voidBiInsertSort(int*a,intlength){for(inti=1;i<length;i++){inttmp=a[i];intleft=0;intright=i-1;intj=0;while(left<=right){intmid=(left+right);if(tmp<a[mid])//折半{right=mid-1;}else{left=mid+1;}}for(j=i-1;j>=left;j--)//后移{a[j+1]=a[j];}a[j+1]=tmp;}}
2.交换排序
两两比较,若发现存在逆序,则交换,一直待到元素序列没有逆序为止
a.冒泡排序
时间复杂度为O (n^2) 是稳定的排序方法
voidBubbleSort(int*a,intlength){for(inti=0;i<length;i++){for(intj=0;j<length-i-1;j++){if(a[j]>a[j+1])swap(a[j],a[j+1]);}}}
b.快速排序
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
intPartition(int*a,inti,intj){intbase=a[i];while(i<j){//从右往左扫描while(base<a[j]&&i<j)j--;if(i<j)//经过上一步while循环,a[i]>a[j]{swap(a[i],a[j]);i++;}//从左往右扫描while(i<j&&base>a[i])i++;if(i<j){swap(a[i],a[j]);j--;}}a[i]=base;returni;}voidQuickSort(int*a,intstart,intend){intindex=0;if(start<end){index=Partition(a,start,end);QuickSort(a,start,index-1);QuickSort(a,index+1,end);}}
3.选择排序
a.直接选择排序
b.堆排序
快速排序
快速排序关键在于先在数组中选择一个数字,接下来吧数组中的数字分为两部分,比选择数组小的放到左边,大的放到右边。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。