在考研数据结构中,排序算法是非常重要的一部分。以下是数据结构排序知识的汇总:
冒泡排序(BubbleSort):比较相邻两个元素的大小,将较大的元素往后移动,较小的元素往前移动。时间复杂度为O(n^2)。
插入排序(InsertionSort):将一个元素插入到已经排好序的序列中,从而得到一个新的有序序列。时间复杂度为O(n^2)。
选择排序(SelectionSort):从未排序的序列中选择一个最小的元素放到已排序序列的末尾。时间复杂度为O(n^2)。
快速排序(QuickSort):选择一个基准元素,将序列分为左右两个子序列,左子序列元素都比基准元素小,右子序列元素都比基准元素大。递归对左右子序列进行快速排序。时间复杂度为O(nlogn)。
归并排序(MergeSort):将序列分成两个子序列,对子序列进行递归归并排序,然后将排好序的子序列合并成一个有序序列。时间复杂度为O(nlogn)。
堆排序(HeapSort):将序列构建成一个最小(或最大)堆,每次将堆顶元素取出,调整剩余元素构成新的最小堆。时间复杂度为O(nlogn)。
基数排序(RadixSort):按照数字位的顺序依次进行排序,时间复杂度为O(dn),其中d是数字的位数,n是元素个数。
计数排序(CountingSort):统计小于等于某个值的元素个数,然后将元素放置到相应的位置。时间复杂度为O(n+k),其中k是元素的取值范围。
以上是常见的排序算法,考研中可能会考到算法的原理、时间复杂度、空间复杂度等方面的问题,因此要对这些知识点进行充分掌握和理解。
以下是常见的排序算法的C++代码实现:
冒泡排序
cssCopycodevoidbubbleSort(intarr[],intn){for(inti=0;in-1;i++){for(intj=0;jn-i-1;j++){if(arr[j]arr[j+1]){swap(arr[j],arr[j+1]);}}}}
插入排序
cssCopycodevoidinsertionSort(intarr[],intn){inti,key,j;for(i=1;in;i++){key=arr;j=i-1;while(j=0arr[j]key){arr[j+1]=arr[j];j=j-1;}arr[j+1]=key;}}
选择排序
cssCopycodevoidselectionSort(intarr[],intn){inti,j,min_idx;for(i=0;in-1;i++){min_idx=i;for(j=i+1;jn;j++){if(arr[j]arr[min_idx]){min_idx=j;}}swap(arr[min_idx],arr);}}
快速排序
scssCopycodevoidquickSort(intarr[],intlow,inthigh){if(lowhigh){intpi=partition(arr,low,high);quickSort(arr,low,pi-1);quickSort(arr,pi+1,high);}}intpartition(intarr[],intlow,inthigh){intpivot=arr[high];inti=(low-1);for(intj=low;j=high-1;j++){if(arr[j]=pivot){i++;swap(arr,arr[j]);}}swap(arr[i+1],arr[high]);return(i+1);}
归并排序
scssCopycodevoidmergeSort(intarr[],intl,intr){if(lr){intm=l+(r-l)/2;mergeSort(arr,l,m);mergeSort(arr,m+1,r);merge(arr,l,m,r);}}voidmerge(intarr[],intl,intm,intr){inti,j,k;intn1=m-l+1;intn2=r-m;intL[n1],R[n2];for(i=0;in1;i++)L=arr[l+i];for(j=0;jn2;j++)R[j]=arr[m+1+j];i=0;j=0;k=l;while(in1jn2){if(L=R[j]){arr[k]=L;i++;}else{arr[k]=R[j];j++;}k++;}while(in1){arr[k]=L;i++;k++;}while(jn2){arr[k]=R