排序

排序算法

快速排序

void quicksort(int left,int right) {
    int i=left,j=right,tmp=a[left],t;
    if(left>right) return;
    while(i!=j) {
        while(a[j] >= tmp && i<j)
            j--;
        while(a[i] <= tmp && i<j)
            i++;
        if(i<j) {
            t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }
    a[left] = a[i];
    a[i] = tmp;
    quicksort(left,i-1);
    quicksort(i+1,right);

}

稳定性:不稳定;
时间复杂度:O(nlogn);


归并排序

void mergeing(int *left,int left_size,int *right,int right_size) {
    int tmp[MAXSIZE];
    int i=0,j=0,k=0;
    while(i<left_size && j<right_size) {
        if(left[i] < right[j])
            tmp[k++] = left[i];
        else
            tmp[k++] = right[j];
    }
    while(i<left_size)
        tmp[k++] = left[i++];
    while(j<right_size)
        tmp[k++] = right[j++];
    for(int m=0;m<(left_size+right_size);m++)
        left[m] = tmp[m];
}
void mergesort(int a[],int n) {
    if(n>1) {
        int *left = a;
        int left_size = n/2;
        int *right = a + n/2;
        int right_size = n - left_size;

        mergesort(left,left_size);
        mergesort(right,right_size);

        mergeing(left,left_size,right,right_size);

    }
}

稳定性:稳定
时间复杂度:O(nlogn)


冒泡排序

for(int i=0;i<n;i++) {
    for(int j=0;j<n-i-1;j++) {
        if(a[j]>a[j+1]) {
            int tmp = a[j];
            a[j] = a[j+1];
            a[j+1] = tmp;
        }
    }
}

稳定性:稳定;
时间复杂度:O(n^2);


选择排序

for(int i=0;i<n;i++) {
    int minIndex = i;
    for(int j=i+1;j<n;j++) {
        if(a[j] < a[minIndex])
            minIndex = j;
    }
    int tmp = a[i];
    a[i] = a[minIndex];
    a[minIndex] = a[i];
}

稳定性:不稳定;
时间复杂度:O(n^2);


直接插入排序

void insertionSort(int a[],int n) {
    for(int i=1;i<n;i++) {
        int j = i-1;
        int tmp = a[i];
        while(j>=0 && tmp < a[j]) {
            a[j+1] = a[j];
            j--;
        }
        a[j+1] = tmp;
    }
}

稳定性:稳定
时间复杂度:O(n^2)


折半插入排序

void binaryInsertionSort(int a[],int n) {
    int i,j,tmp,hight,low,mid;
    for(i=1;i<n;i++) {
        low = 0;
        hight = i-1;
        tmp = a[i];
        while(low <= hight) {
            mid = (low+hight)/2;
            if(a[mid] > tmp)
                hight = mid-1;
            else
                low = mid+1;
        }
        for(j=i-1;j<hight-1;j++)
            a[j+1] = a[j];
        a[j+1] = tmp;

    }

}

稳定性:稳定
平均时间复杂度:O(n^2)


希尔排序

void shellSort(int a[],int n) {
    int gap = n/2;
    while(gap >= 1) {
        for(int i=gap;i<n;i++) {
            int j = i-gap;
            int tmp = a[i];
            while(j>=0 && tmp < a[j]) {
                a[j+gap] = a[j];
                j -= gap;
            }
            a[j+gap] = tmp;
        }
        gap /= 2;
    }
}

稳定性:不稳定
平均时间复杂度:O(n^1.3)


堆排序

void swap(int a[],int i,int j) {
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}

void heapity(int a[],int i,int n) {            //调整堆
    int left = 2*i+1,right = 2*i+2,largest = i;
    if(left > n && a[left] > a[largest])
        largest = left;
    if(right >n && a[right] > a[largest])
        largest = right;
    if( largest != i) {
        swap(a,i,largest);
        heapity(a,largest,n);
    }
}

void buildHeap(int a[],int n) {     //建立大顶堆
    for(int i=n/2;i>=0;i--) {
        heapity(a,i,n);
    }
}

void HeapSort(int a[],int n) {
    buildHeap(a,n);
    for(int i=n-1;i>=0;i--) {
        swap(a,0,i);
        n--;
        heapity(a,0,n);
    }
}

稳定性:不稳定
平均时间复杂度:O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值