数据结构-----排序(只有代码)

目录

一、插入排序

1、直接插入排序

2.折半插入排序

3.希尔排序

二、交换排序

1.冒泡排序

2.快速排序

三、选择排序

1.简单选择排序

2.堆排序

四、二路归并排序


一、插入排序

1、直接插入排序

void insertSort(int *A, int n)
{
    int i,j;
    for (i=2;i<=n;i++) {
        if(A[i]<A[i-1]){
            A[0]=A[i];
            for (j=i-1;A[0]<A[j];j--) {
                A[j+1]=A[j];
            }
            A[j+1]=A[0];
        }
    }
}

2.折半插入排序

void inserSortByHalf(int *A, int n)
{
    int i,j,low,mid,high;
    for (i=2;i<=n;i++) {
        A[0]=A[i];
        low=1;
        high=i-1;
        while (low<=high) {
            mid=(low+high)/2;
            if(A[mid]>A[0])
                high=mid-1;
            else
                low = mid+1;
        }
        for (j=i-1;j>=high+1;j--) {
            A[j+1]=A[j];
        }
        A[high+1]=A[0];
    }

}

3.希尔排序

void shellSort(int *A, int n)  //类似直接插入
{
    int i,j;
    for (int dk=n/2;dk>=1;dk/=2) {
        for (i=dk+1;i<=n;i++) {
            if(A[i]<A[i-dk]){
                A[0]=A[i];
            for (j=i-dk;j>0 && A[0]<A[j];j-=dk)
                A[j+dk]=A[j];
                A[j+dk]=A[0];
            }
        }
    }
}

二、交换排序

1.冒泡排序

void BubbleSort(int *A, int n)
{

    for (int i=0;i<n-1;i++) {
        bool isBubble=false;
        for (int j=0;j<n-i-1;j++) {
            if(A[j-1]>A[j]){
                swap(A[j],A[j-1]);
                isBubble=true;
            }
        }
        if(!isBubble)
            return;
    }
}

2.快速排序

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);
    }
}

三、选择排序

1.简单选择排序

void selectSort(int *A, int n)
{
    for (int i=0;i<n-1;i++) {
        int min=i;
        for (int j=i+1;j<n;j++) {
            if(A[j]<A[min])
                min=j;
        }
        if(min!=i)
        swap(A[i],A[min]);
    }
}

2.堆排序

void HeadAdjust(int *A, int k, int len)
{
    A[0]=A[k];
    for (int i=2*k;i<=len;i*=2) {
        if(A[i]<A[i+1] && i<len)  //A[i]>A[i+1]
            i++;
        if(A[0]>=A[i]) //A[0]<=A[i]     就是从大到小
            break;
        else{
            A[k]=A[i];
            k=i;//再对i做调整
        }
    }
    A[k]=A[0];
}

void buildMaxHeap(int *A, int len)
{
    for (int i=len/2;i>0;i--) {
        HeadAdjust(A,i,len);
    }
}

void heapSort(int *A, int len)
{
    buildMaxHeap(A,len);
    for (int i=len;i>1;i--) {
        swap(A[i],A[1]);
        HeadAdjust(A,1,i-1);
    }
}

四、二路归并排序

void merge(int *A, int low, int mid, int high)
{
    int i,j,k;
    for ( k=low;k<=high;k++)
        B[k]=A[k];
    for ( i=low,j=mid+1,k=i;i<=mid&&j<=high;k++) {
        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)/2;
        mergeSort(A,low,mid);
        mergeSort(A,mid+1,high);
        merge(A,low,mid,high);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值