侧边栏壁纸
  • 累计撰写 49 篇文章
  • 累计创建 5 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

排序

Administrator
2024-08-23 / 0 评论 / 0 点赞 / 9 阅读 / 4111 字
温馨提示:
本文最后更新于 2024-08-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

排序

直接插入排序

void InsertSort(int a[],int n){
    for(int i=2;i<=n;i++){
        //a[0]为哨兵 
        a[0] = a[i];
        int j;
        for(j=i-1;a[0]<a[j];j--){
            a[j+1] = a[j];
        }
        a[j+1] = a[0];
    }
}

折半插入排序

void InsertSort(int a[],int n){
    for(int i=2;i<=n;i++){
        //a[0]为哨兵  
        a[0] = a[i];
        int low = 1,high = i-1;
        while(low<=high){
            int mid = (low+high)/2;
            if(a[mid]>a[0]) high = mid-1;
            else low = mid+1;
        }
        for(int j=i-1;j>=low;j--){
            a[j+1] = a[j];
        }
        a[low] = a[0];
    }
}

希尔排序

void ShellSort(int a[], int n) {
    for(int d=n/2;d>=1;d/=2){
        for(int i=0;i<d;i++){
            for(int j=i+d;j<=n;j+=d){
                a[0]=a[j];
                int k;
                for(k=j-d;k>=0&&a[0]<a[k];k-=d){
                    a[k+d]=a[k];
                }
                a[k+d]=a[0];
            }
        }
    }
}

选择排序

void SelectSort(int a[],int n){
    for(int i=1;i<=n;i++){
        int tmp=i;
        for(int j=i+1;j<=n;j++){
            if(a[j]<a[tmp]){
                tmp=j;
            }
        }
        swap(a[tmp],a[i]);
    }

}

冒泡排序

void BubbleSort1(int a[], int n) {
    for(int i=1;i<n;i++) {
        bool flag = false;
        for(int j=n-1;j>=i;j--) {
            if(a[j-1]>a[j]) {
                int tmp=a[j-1];
                a[j-1]=a[j];
                a[j]=tmp;
                flag = true;
            }
        }
        if(!flag) return;
    }
}

快速排序

int Partition(int a[],int low,int high){
    int pivot = a[low];
    while(low<high){
        while(low<high&&a[high]>=pivot) high--;
        a[low] = a[high];
        while(low<high&&a[low]<=pivot) low++;
        a[high] = a[low];
    }
    a[low] = pivot;
    return low;
}
void QuickSort(int a[],int low,int high){
    if(low<high){
        int pivotpos = Partition(a,low,high);
        QuickSort(a,low,pivotpos-1);
        QuickSort(a,pivotpos+1,high);
    }
}

堆排序

void HeadAdjust(int a[],int k,int n){
    a[0] = a[k];
    for(int i=k*2;i<=n;i*=2){
        if(i<n&&a[i]<a[i+1]){
            i++;
        }
        if(a[0]>=a[i]) break;
        else{
            a[k]=a[i];
            k=i;
        }
    }
    a[k] = a[0];
}

//建立大根堆
void BuildMaxHeap(int a[],int n){
    for(int i=n/2;i>=1;i--){
        HeadAdjust(a,i,n);
    }
}

//堆排序
void HeapSort(int a[],int n){
    BuildMaxHeap(a,n);
    for(int i=n;i>1;i--){
        swap(a[i],a[1]);
        HeadAdjust(a,1,i-1);
    }
}

归并排序

void Merge(int a[],int low,int mid,int high){
    for(int i=low;i<=high;i++){
        b[i] = a[i];
    }
    int k=low,i=low,j=mid+1;
    while(i<=mid&&j<=high){
        if(b[i]<=b[j]){
            a[k++] = b[i++];
        }else{
            a[k++] = b[j++];
        }
    }
    while(i<=mid) a[k++] = b[i++];
    while(j<=high) a[k++] = b[j++];
}

void MergeSort(int a[],int low,int high){
    if(low<high){
        int mid = low+high>>1;
        MergeSort(a,low,mid);
        MergeSort(a,mid+1,high);
        Merge(a,low,mid,high);
    }
}
0

评论区