• 排序原始数据[置顶] 各种常见排序算法实现


    本篇文章朋友在上海游玩的时候突然想到的...这段时间就有想写几篇关于排序原始数据的博客,所以回家到之后就奋笔疾书的写出来发布了

        将各种见常排序法算简略实现了一下,包含:1、简略插入排序;2、冒泡排序;3、简略选择排序;4、快速排序;5、希尔排序;6、堆排序

        #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>

    #define LEN 10

    //初始化组数
    void init(int arr[], int len);
    //打印组数元素
    void print(int arr[], int len);
    //打印堆元素
    void printH(int arrH[], int len);
    //交换两个数整的值
    void swap(int & a, int & b);
    //简略插入排序
    void insertSort(int arr[], int len);
    //冒泡排序
    void bubbleSort(int arr[], int len);
    //简略选择排序
    void selectSort(int arr[], int len);
    //返回快排枢轴下标
    int partion(int arr[], int low, int high);
    //快速排序
    void quickSort(int arr[], int low, int high);
    //堆整调
    void heapAjust(int arrH[], int s, int m);
    //堆排序
    void heapSort(int arrH[],int len);
    //希尔排序
    void shellSort(int arr[], int len);


    int main()
    {
        int arr[LEN];
        //堆排序用,arrH[0]做临时量变用使
        int arrH[LEN+1];
        srand((unsigned)time(NULL));
        //简略插入排序
        init(arr,LEN);
        printf("\n原始数据:");
        print(arr,LEN);
        printf("插入排序后:");
        insertSort(arr,LEN);
        print(arr,LEN);
        //冒泡排序
        init(arr,LEN);
        printf("\n原始数据:");
        print(arr,LEN);
        printf("冒泡排序后:");
        bubbleSort(arr,LEN);
        print(arr,LEN);
        //简略选择排序
        init(arr,LEN);
        printf("\n原始数据:");
        print(arr,LEN);
        printf("简略选择排序后:");
        selectSort(arr,LEN);
        print(arr,LEN);
        //快速排序
        init(arr,LEN);
        printf("\n原始数据:");
        print(arr,LEN);
        printf("快速排序后:");
        quickSort(arr,0,LEN);
        print(arr,LEN);
        //希尔排序
        init(arr,LEN);
        printf("\n原始数据:");
        print(arr,LEN);
        printf("希尔排序后:");
        shellSort(arr,LEN);
        print(arr,LEN);
        //对排序
        init(arrH,LEN+1);
        arrH[0] = 100;//将第一个元素初始化为0
        printf("\n原始数据:");
        printH(arrH,LEN+1);
        printf("堆排序后:");
        heapSort(arrH,LEN);
        printH(arrH,LEN+1);

        return 0;
    }

    //初始化组数
    void init(int arr[], int len)
    {
       int i;
       for (i = 0; i< len; i++)
       {
           arr[i] = rand() % 1000;
       }
    }

    //打印组数元素
    void print(int arr[], int len)
    {
       int i;
       printf("\n");
       for (i = 0; i < len; i++)
           printf("%d    ",arr[i]);
       printf("\n");
    }
    //打印堆元素
    void printH(int arrH[], int len)
    {
       int i;
       printf("\n");
       for (i = 1; i < len; i++)
           printf("%d    ",arrH[i]);
       printf("\n");
    }
    //交换两个数整的值
    void swap(int & a, int & b)
    {
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
    }
    //简略插入排序
    void insertSort(int arr[], int len)
    {
        int i,j,temp;
        for (i = 1; i < len; i++)
        {
            temp = arr[i];
            for(j = i - 1; j >= 0 && arr[j] > temp; j--)
                arr[j+1] = arr[j];
            arr[j+1] = temp;
        }      
    }
    //冒泡排序
    void bubbleSort(int arr[], int len)
    {
        int i,j,exchange;
        exchange = 0;
        for (i = 0; i < len - 1; i++)
        {
            for (j = 0; j < len - i - 1; j++)
            {
                if (arr[j] > arr[j+1])
              {
                    swap(arr[j],arr[j+1]);
                    exchange = 1;
                }
            }
            //如果没交换元素,说明已排好序
            if (!exchange)
            {
                break;
            }
        }
    }
    //简略选择排序
    void selectSort(int arr[], int len)
    {
        int i,j,temp;
        for (i = 0; i < len - 1; i++)
        {
            temp = i;
            for (j = i + 1; j < len; j++)
            {
                if (arr[j] < arr[temp])
                {
                    temp = j;
                }
            }
            if (temp != i)
            {
                swap(arr[temp],arr[i]);
            }
        }
            
    }
    //返回快排枢轴下标
    int partion(int arr[], int low, int high)
    {
        int temp;
        temp = arr[low];
        while (low < high)
        {
            while (low < high && arr[high] >= temp)
                high--;
            arr[low] = arr[high];
            while (low < high && arr[low] <= temp)
                low++;
            arr[high] = arr[low];
        }
        arr[low] = temp;
        return low;
    }
    //快速排序
    void quickSort(int arr[], int low, int high)
    {
        if (low > high || low < 0 || high < 0)
        {
            return;
        }

        if (low < high)
        {
        int mid = partion(arr,low,high);
            quickSort(arr,low,mid - 1);
            quickSort(arr,mid + 1,high);
        }         
    }
    //堆整调,大堆
    void heapAjust(int arrH[], int s, int m)
    {
        int temp = arrH[s];
        int i;
        for (i = 2 * s; i <= m; i *= 2)
        {
            if ((i < m) && (arrH[i] < arrH[i+1]))
               i++;
            if(arrH[i] <= temp)
               break;
            arrH[s] = arrH[i];
            s = i;
        }
        arrH[s] = temp;
    }
    //堆排序
    void heapSort(int arrH[],int len)
    {
        int i;
        for (i = len / 2; i > 0; i--)
            heapAjust(arrH,i,len);
        for (i = len; i > 1; i--)
        {
            swap(arrH[1],arrH[i]);
            heapAjust(arrH,1,i - 1);
        }
    }
    //希尔排序
    void shellSort(int arr[], int len)
    {
     int h = 0;
     int i = 0;
     int j = 0;
     //设置步长
     for(h = 1; h < len; h = 3 * h + 1)
         ;
     while(h)
     {
         h /= 3;
         if(h < 1)
             break;
         for(i = h; i < len; i++)
            for(j = i; j >= h; j-=h)
            {
               if(arr[j-h] < arr[j])
                  break;
               swap(arr[j-h],arr[j]);
            }
      }
    }

        每日一道理
    生命不是一篇"文摘",不接受平淡,只收藏精彩。她是一个完整的过程,是一个"连载",无论成功还是失败,她都不会在你背后留有空白;生命也不是一次彩排,走得不好还可以从头再来,她绝不给你第二次机会,走过去就无法回头。

        

    文章结束给大家分享下程序员的一些笑话语录: 程序员的愿望
      有一天一个程序员见到了上帝.上帝: 小伙子,我可以满足你一个愿望.程序员: 我希望中国国家队能再次打进世界杯.
      上帝: 这个啊!这个不好办啊,你还说下一个吧!
      程序员: 那好!我的下一个愿望是每天都能休息6个小时以上.
      上帝: 还是让中国国家打进世界杯.

  • 相关阅读:
    图解排序算法(三)之堆排序
    博客园添加看板娘
    php设计模式
    PHP二维数组排序 array_multisort
    php-jwt-token
    c++实现冒泡排序
    常见的排序 转
    Mac VMware Fusion CentOS7配置静态IP
    vmwar快照和克隆区别
    springboot maven打包插件
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3047918.html
Copyright © 2020-2023  润新知