排序问题1

VisuAIgo算法可视化
参考1 常见排序算法pdf
参考2 十大排序算法

选择排序

不稳定,例如排序 5` , 5``,2

第一趟:2,5`` ,5`

第二趟:2,5``,5`

void selection_sort(int a[], int len)
{
    for(int i=0; i<len-1; i++)
    {
        int min_i = i;
        for(int j=i+1; j<len; j++)  // 遍历未排序元素
            if(a[j] < a[min_i])    // 查找当前最小值
                min_i = j;      // 记录

        int temp = a[min_i];  //交换 swap(a[min_i], a[i]);
        a[min_i] = a[i];
        a[i] = temp;
    }
}

冒泡排序

void bubble_sort(int a[], int len)
{
    bool swapped = 1;  // 优化,若无交换则已经有序
    for(int i=0; i<len-1 && swapped; i++)  // 排序趟数
    {
        swapped = 0;
        for(int j=0; j<len-1-i; j++)  // 每趟比较次数,[len-1-i ... len-1]已经有序
            if(a[j] > a[j+1])  // 相邻元素比较,逆序则交换
            {
                swap(a[j], a[j+1]);
                swapped = 1;
            }
    }
}

插入排序

void insert_sort(int a[],int len)
{
	// 第一个(i==0)已有序
    for(int i=1; i<len; i++)  
    {
        for(int j=i; j>0; j--)  // 用待插入值(a[i])往前比较
            if(a[j] < a[j-1])   // 更小则交换
                swap(a[j], a[j-1]);
            else
                break;
    }
}
    int key;
    for(int i=1; i<len; i++)
    {
        key = arr[i];
        j=i-1;
        while(j>=0 && arr[j]>key)  // 减少交换次数
        {
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = key;
    }

二分查找插入排序:如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。

计数排序

非比较排序,小范围整数(可为负)。时间复杂度O(n+k)

// 此为简单实现:未保证稳定性
void counting_sort(int a[], int len, int min_v, int max_v)
{
	//min_v = 0
    int c[max_v-min_v+1] = {0};  // 计数
    for(int i=0; i<len; i++)
    {
        c[a[i]-min_v]++;
    }
    int sorted_idx = 0;
    for(int v=min_v; v<=max_v; v++)
    {
        while(c[v-min_v] > 0)
        {
            a[sorted_idx++] = v;  // 排序
            c[v-min_v]--;
        }
    }
}

洛谷1059

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值