voidInsertSortGap(int arr[],int size,int gap){//预排序过程for(int i =gap;i<size;i++){int k = arr[i];int j =0;for(j = i-gap;j>=0;j-=gap){if(arr[j]<=k){break;}else{
arr[j+gap]= arr[j];}}
arr[j+gap]= k;}}voidShellSort(int arr[],int size){//降序int gap = size;while(1){
gap = gap/3+1;//gap比较大的数->小->1停止;InsertSortGap(arr,size,gap);if(gap ==1){break;}}}
选择排序
3.单向/双向直接选择排序(使用顺序遍历查找)
voidswap(int*a,int*b){int t =*a;*a =*b;*b = t;}voidSelectSort(int* arr,int size){//降序,每次选最小的数;O(n^2)O(1);不稳定for(int i =0;i<size;i++){int min = i;//假设最开始的数是最小的;for(int j = i+1;j<size;j++){if(arr[j]<arr[min]){
min = j;}}//交换最小的数到合适的位置[i];swap(arr+min,arr+i);}}//双向选择;//优化版:一次遍历中既选最大又选最小;voidSelectSortPlus(int* arr,int size){//降序,每次选最小的数;O(n^2)O(1);不稳定int minSpace =0;int maxSpace = size-1;while(minSpace<maxSpace){int min = minSpace;int max = minSpace;for(int j = minSpace+1;j<=maxSpace;j++){if(arr[j]<arr[min]){
min = j;}if(arr[j]>arr[max]){
max = j;}}swap(arr+min,arr+minSpace);if(minSpace==max){
max = min ;//此时max已经被上一步交换走了;}swap(arr+max,arr+maxSpace);
minSpace++;
maxSpace--;}}
4.堆排序(使用二叉堆)
O(n*logN)(向下调整的时间复杂度是O(logN));
voidSwap(int* a,int*b){int t =*a;*a =*b;*b =t;}voidAdjustDown(int arr[],int size,int root){while(1){int left =2*root+1;if(left>=Size){return;}int right =2*root+2;int max = left;if(rightt<Size&&array[right]>array[left]){
max = right;}if(array[root]>array[max]){return;}Swap(arr+root,arr+max);
root = max;}}voidCreatBigHeap(int arry[],int size){//从最后一个非叶子节点点开始调整for(int i =((size-1)-1)/2;i>=0;i--){AdjustDown(arry,size,i);}}voidHeapSort(int arr[],int size){CreatBigHeap(arr,size);for(int i =0;i<size-1;i++){//将最后一个元素和堆顶交换,然后堆规模减1,堆向下调整int t = arr[0];
arr[0]= arr[size-1-i];
arr[size-1-i]= t;AdjustDown(arr,size-1-i,0);//注意此处第二个参数是堆的原始规模:size,第一次减1,再每次减i,我曾经将这里看成原始规模是size-1(数组下标)写成了size-2-i;}}
交换排序
5.冒泡排序
O(n^2)
voidBubbleSort(int*arr,int size){for(int i =0;i<size-1,i++){int check =1;for(int j =0;j<size-1-i;j++){if(arr[j]>arr[j+1]){swap(arr+j,arr+j+1);
check =0;}}if(check==1){return;}}}