码迷,mamicode.com
首页 > 编程语言 > 详细

八种排序方法

时间:2021-05-24 16:38:12      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:inf   使用   没有   情况   代码   实现   void   循环   为什么   

一.直接(选择)插入排序

有两种方式:升序和降序 我使用升序

第一种排序:直接(简单)插入排序:每次向已经排序好的

队列里面找个合适的位置,将值插入

技术图片  技术图片

//笔试和面试:

//1.算法的描述 2.算法的实现 3.效率(时间复杂度和空间复杂度和稳定性)

//稳定性定义:如果两个关键值A和A`,如果一开始A就在A`前面,你排序后A还在A`前面,我们就认为

是稳定的

//怎么看稳定性:看有没有跳跃交换

//第一种排序算法:直接插入排序:如果数组基本有序,我们就用直接插入排序,越有序,时间复杂度

越小,极端情况下为O(n)

//时间复杂度O(n^2) 空间复杂度O(1) ,稳定的

//为什么不用从前向后找:如果数组有序,则时间复杂度太大

具体代码实现:

#include <stdio.h>
#include <assert.h>

void InsertSort(int arr[], int len)
{
    //循环多少次 个数-1
    //用临时量tmp保存关键值,从后向前找,比它小的或者走到了头,就将关键值放到下一个位置上
    assert(arr != NULL);
    if (NULL == arr)
        return;
    int count = 0;

    int tmp = 0;
    int j = 0;
    for (int i = 1; i < len; i++)//控制揭牌后需要排序的次数
    {
        tmp = arr[i];

        for (j = i - 1; j >= 0; j--)//从后向前找
        {
            if (arr[j] > tmp)//比关键值大,则向后移动
            {
                arr[j + 1] = arr[j];
                count++;
            }
            else
            {
                break;//找到了比它小的值 退出
            }
        }
        arr[j + 1] = tmp;
    }

    printf("count %d\n", count);
}


void Show(int* arr, int len)
{
    assert(arr != NULL);
    if (NULL == arr)
        return;


    for (int i = 0; i < len; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}
int main()
{
    int arr[] = { 2,4,6,8,23,98,76,56,74,36,1,3,5,7,99,66,77,88 };
    InsertSort(arr, sizeof(arr) / sizeof(arr[0]));
    Show(arr, sizeof(arr) / sizeof(arr[0]));
    return 0;
}

第二种排序算法:希尔shell排序,就是一种特殊的直接插

入排序,只不过调用了很多次直接插入排序,//按增量分组

要求:增量最后一个必须为1, 增量保持互素

希尔排序效率分析:

1.时间复杂度O(n^1.3~1.5)
2.空间复杂度O(1)
3.稳定性:发生了跳跃交换,所以不稳定
不稳定
技术图片
例如:
分成5组,处理之后的值:
技术图片
分成3组,处理之后的值: 
技术图片
最后分成1组,处理之后的值:
技术图片

具体代码实现:

#include <stdio.h>
#include <assert.h>


static void Shell(int arr[], int len, int gap)//gap 分成多少组(间隔)
{
    int tmp = 0;
    int j = 0;
    int count = 0;
    for (int i = gap; i < len; i++)//i开始的位置
    {
        tmp = arr[i];
        for (j = i - gap; j >= 0; j = j - gap)
        {
            if (arr[j] > tmp)
            {
                arr[j + gap] = arr[j];
                count++;
            }
            else
            {
                break;
            }
        }
        arr[j + gap] = tmp;
    }
    printf("%d count %d\n", gap, count);
}

void ShellSort(int arr[], int len)
{
    assert(arr != nullptr);
    if (NULL == arr)
        return;
    int dk[] = { 5, 3, 1 };
    for (int i = 0; i < sizeof(dk) / sizeof(dk[0]); i++)
    {
        Shell(arr, len, dk[i]);
    }
}
void Show(int* arr, int len)
{
    assert(arr != NULL);
    if (NULL == arr)
        return;


    for (int i = 0; i < len; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}


int main()
{
    int arr2[] = { 2,4,6,8,23,98,76,56,74,36,1,3,5,7,99,66,77,88 };
    ShellSort(arr2, sizeof(arr2) / sizeof(arr2[0]));
    Show(arr2, sizeof(arr2) / sizeof(arr2[0]));
    return 0;
}

 

八种排序方法

标签:inf   使用   没有   情况   代码   实现   void   循环   为什么   

原文地址:https://www.cnblogs.com/xpei-1124/p/14786322.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!