排序算法汇总

选择排序:

#include<stdio.h>
void SelectSort(int r[], int n);
int main() {
    int i;
    int text[] = { 1,4,5,3,2,5,767,5,6,12 };
    SelectSort(text, 10);
    printf("升序:");
    for (i = 0; i < 10; i++) {
        printf("%d ", text[i]);
    }
    printf("\n");
    getchar();
    return 1;
}
void SelectSort(int text[], int n)
{
    int i, j, index, temp;
    for (i = 0; i < n - 1; i++) {
        index = i;
        for (j = i + 1; j < n; j++) {
            if (r[j] < r[index]) index = j;
        }
        if (index != i) {
            temp = r[i]; r[i] = r[index]; r[index] = temp;
        }
    }
}

冒泡排序1:

#include<stdio.h>
void BubbleSort(int text[], int n);
int main() {
    int i;
    int text[] = { 1,4,5,3,2,5,767,5,6,12 };
    BubbleSort(text, 10);
    printf("升序:");
    for (i = 0; i < 10; i++) {
        printf("%d ", text[i]);
    }
    printf("\n");
    getchar();
}
void BubbleSort(int text[],int n) {
    int i, j,temp;
    for (j = 0; j < n - 1; j++) {
        for (i = 0; i < n - 1 - j; i++) {
            if (text[i] > text[i + 1]) {
                temp = text[i];
                text[i] = text[i + 1];
                text[i + 1] = temp;
            }
        }
    }
}

冒泡排序2:

#include<stdio.h>
void BubbleSort(int text[], int n);
int main() {
    int i;
    c = 0;
    e = 0;
    int text[] = { 1,4,5,3,2,5,767,5,6,12 };
    BubbleSort(text, 10);
    printf("升序:");
    for (i = 0; i < 10; i++) {
        printf("%d ", text[i]);
    }
    printf("\n");
    getchar();
    return 1;
}
void BubbleSort(int text[], int n)
{
    int bound, exchange,i,temp;
    exchange = n - 1;
    while (exchange != 0) {
        bound = exchange;
        exchange = 0;
        for (i = 0; i < bound; i++) {
            if (text[i]>text[i+1]) {
                temp = text[i];
                text[i] = text[i + 1];
                text[i + 1] = temp;
                exchange = i;
            }
        }
    }
}
冒泡排序2的时间复杂度:

比较次数:

{n1,n(n+1)2, { n − 1 , 最 好 n ( n + 1 ) 2 , 最 坏

交换次数:
{0,n(n+1)2, { 0 , 最 好 n ( n + 1 ) 2 , 最 坏

时间复杂度:
{n1+0=n1=>O(n),n(n+1)2+n(n+1)2=n(n1=>O(n2), { n − 1 + 0 = n − 1 => O ( n ) , 最 好 n ( n + 1 ) 2 + n ( n + 1 ) 2 = n ( n − 1 => O ( n 2 ) , 最 坏

直接排序:

#include<stdio.h>
int main() {
    int i, j, len, temp, c, e;
    c = 0;
    e = 0;
    int text[] = { 1,4,5,3,2,5,767,5,6,12 };
    for (j = 0; j < 10; j++) {
        for (i = 0; i < 10; i++) {
            if (text[j] < text[i]) {
                temp = text[j];
                text[j] = text[i];
                text[i] = temp;
            }
        }
    }
    printf("降序:");
    for (i = 0; i < 10; i++) {
        printf("%d ", text[i]);
    }
    printf("\n");
    for (j = 0; j < 10; j++) {
        for (i = 0; i < 10; i++) {
            if (text[j] > text[i]) {
                temp = text[j];
                text[j] = text[i];
                text[i] = temp;
            }
        }
    }
    printf("升序:");
    for (i = 0; i < 10; i++) {
        printf("%d ", text[i]);
    }
    printf("\n");
    getchar();
    return 1;
}

归并排序

属于分治策略中的一种排序算法
声明:图片来源为:https://www.cnblogs.com/chengxiao/p/6194356.html
归并过程
合并过程

#include <iostream>
#include <string>
using namespace std;
void merge(int n[], int s, int m, int e, int temp[]) {
    int t = 0;
    int i = s;
    int j = m + 1;
    while (i <= m && j <= e) {
        if (n[i] > n[j]) {
            temp[t++] = n[j++];
        }
        else {
            temp[t++] = n[i++];
        }
    }
    while (i <= m) {
        temp[t++] = n[i++];
    }
    while (j <= e) {
        temp[t++] = n[j++];
    }
    cout <<"merge:" <<c<< endl;
    t = 0;
    while (s <=e) {
        n[s++] = temp[t++];
    }
}
void sort(int n[], int s, int e, int temp[]) {
    if (s < e) {
        int m = (s + e) / 2;
        sort(n, s, m, temp);
        sort(n, m + 1, e, temp);
        merge(n, s, m, e, temp);
    }
    cout <<"sort:"<< c << endl;
}
void main() {
    int n[] = { 1,3,8,7,4,9,2,5,11,10 };
    int temp[10];
    sort(n, 0, 9, temp);
    for (int i : n) {
        cout << i<<" ";
    }
    getchar();
}
时间复杂度:

时间复杂度=拆分(int m = (s + e) / 2)+解决问题(两个递归语句:2T(1/2n))+合并(n)。
  其中拆分时间规模为一个常数,故可忽略不计,则有:2T(n/2)+n。
Tn=

{1,2T(n/2)+n,n=1n>1 { 1 , n = 1 2 T ( n / 2 ) + n , n > 1

可得:
T(n)=O(nlog2n)

快速排序

交替扫描,递归重复
这里写图片描述
第一次划分结束后将pos-1看成左子段的high,将pos+1看成右子段的low,递归划分

int Partition(int T[],int s,int e){
    int i,j;
    i=s;
    j=e;
    while (i < j) {
        while (i<j&&T[i] <= T[j]) {
            j--;
        }
        if (i<j) {
            int temp = T[i];
            T[i] = T[j];
            T[j] = temp;
            i++;
        }
        while (j>i&&T[j] >= T[i]) {
            i++;
        }
        if (j>i) {
            int temp = T[i];
            T[i] = T[j];
            T[j] = temp;
            j--;
        }
    }
    return i;
}

void QuickSort(int T[],int s,int e){
    if(s<e){
        int p;
        p=Partition(T,s,e);
        QuickSort(T,s,p-1);
        QuickSort(T,p+1,e);
    }
}

void main(){
    int T[]={1,9,6,4,8,7,2,0,3};
    QuickSort(T,0,8);
    for(int t=0;t<9;t++){
        cout<<T[t]<<endl;
    }
    system("pause");
}
时间复杂度

最好情况:每次划分对一个记录定位后,该记录的左侧子序列与右侧的长度相同,时间复杂度同归并排序,为:
T(n)=2*T(n/2)+n,即O(nlog2n)

最坏情况:待排序为正序或者逆序,每次划分只得到一个比上一次划分少一个记录的子序列,此时,必须经过n-1次递归才能把所有记录定位,而且第i趟划分需要经过n-i次才能找到第i个记录的位置,所以时间复杂度为:
n1i=1 ∑ i = 1 n − 1 (n-i)=1/2*n*(n-1)=O(n^2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
排序算法中,时间复杂度是评估算法性能的重要指标。根据引用和引用的内容,下面是一些常见排序算法的时间复杂度汇总: 1. 冒泡排序:冒泡排序是一种简单但效率较低的排序算法。最坏情况下,冒泡排序的时间复杂度是O(n^2),其中n是待排序元素的数量。最好情况下,当数据已经有序时,冒泡排序的时间复杂度是O(n)。 2. 插入排序:插入排序算法根据待排序序列中的元素逐个插入已排序序列的合适位置。最坏情况下,插入排序的时间复杂度也是O(n^2)。最好情况下,当数据已经有序时,插入排序的时间复杂度是O(n)。 3. 选择排序:选择排序是一种简单的排序算法,每次从未排序的部分选择最小(或最大)的元素,然后放到已排序部分的末尾。选择排序的时间复杂度始终为O(n^2),无论数据是否有序。 4. 快速排序:快速排序是一种高效的排序算法,基于分治的思想。最坏情况下,快速排序的时间复杂度是O(n^2),但通常情况下,快速排序的平均时间复杂度是O(nlogn)。 5. 归并排序:归并排序是一种稳定且高效的排序算法,基于分治和合并的思想。归并排序的时间复杂度始终为O(nlogn),无论数据是否有序。 综上所述,不同的排序算法其时间复杂度不同。冒泡排序和插入排序的时间复杂度是O(n^2),选择排序的时间复杂度也是O(n^2),而快速排序和归并排序的时间复杂度是O(nlogn)。请注意,这些时间复杂度都是在最坏情况下估计的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值