zoukankan      html  css  js  c++  java
  • 选择排序

    算法思想

    从左到右依次比较,找出全部无序最小的元素与数组中的第一个元素进行交换;然后从第数组中第二个元素
    开始比较,找出剩余无序元素中最小的的元素,然后将其与数组中的第二个元素进行交换,按照这种方式操作
    下去直到数组有序

    例:升序排序8,1,6,3,2,4
    20190812091752.png

    代码实现

    bool SelectionSort(int *pAry, int nSize)
    {
      if (pAry == nullptr || nSize <= 0)
      {
        return false;
      }
    
      for (int iIndex = 0; iIndex < nSize-1; iIndex++)
      {
        int nIndexOfMinValue = iIndex;
        for (int jIndex = iIndex+1; jIndex < nSize; jIndex++)
        {
          if (pAry[nIndexOfMinValue] > pAry[jIndex])
          {
            nIndexOfMinValue = jIndex;
          }
        }
    
        if (nIndexOfMinValue != iIndex)
        {
          int nTemp = pAry[nIndexOfMinValue];
          pAry[nIndexOfMinValue] = pAry[iIndex];
          pAry[iIndex] = nTemp;
        }
      }
    
      return true;
    }
    

    测试代码:

    void PrintData(int*pAry, int nSize)
    {
      for (int jIndex = 0; jIndex < nSize; jIndex++)
      {
        printf("%d ", pAry[jIndex]);
      }
      printf("
    ");
    }
    
    int main()
    {
      srand(time(NULL));
    
      int nArry[20] = { 0 };
    
      for (int jIndex = 0; jIndex < 10; jIndex++)
      {
        for (int iIndex = 0; iIndex < sizeof(nArry) / sizeof(nArry[0]); iIndex++)
        {
          nArry[iIndex] = rand() % 150;
        }
        printf("排序前:");
        PrintData(nArry, sizeof(nArry) / sizeof(nArry[0]));
        SelectionSort(nArry, sizeof(nArry) / sizeof(nArry[0]));
        printf("排序后:");
        PrintData(nArry, sizeof(nArry) / sizeof(nArry[0]));
      }
      return 0;
    }
    

    测试结果:
    20190812092919.png

    时间复杂度分析

    假设待排序元素有n个,核心部分代码如下:

    //执行n次
     for (int iIndex = 0; iIndex < nSize-1; iIndex++)
    {
        //执行n-1次
        int nIndexOfMinValue = iIndex;
        //执行1+2+...+n次
        for (int jIndex = iIndex+1; jIndex < nSize; jIndex++)
        {
          //执行1+2+...+n-1次
          if (pAry[nIndexOfMinValue] > pAry[jIndex])
          {
            //最好的情况下:执行0次
            //最好的情况下:执行1+2+...+n-1次
            nIndexOfMinValue = jIndex;
          }
        }
       
        //执行n-1次
        if (nIndexOfMinValue != iIndex)
        {
          //最好的情况下:执行0次
          //最好的情况下:n-1次
          int nTemp = pAry[nIndexOfMinValue];
          pAry[nIndexOfMinValue] = pAry[iIndex];
          pAry[iIndex] = nTemp;
        }
    }
    

    最好的情况下(排序前数组中的元素已经有序了):
    T(n) = n+(n-1)+(1+2+...+n)+(1+2+.....+n-1)+(n-1) = n^2+3n-2 = O(n^2)
    最坏的情况下(排序前数组中的元素是逆序的):
    T(n) =n+(n-1)+(1+2+...+n)+2*(1+2+.....+n-1)+2*(n-1)=(5/2)*n+(3/2)*(n^2)-3=O(n^2)

    稳定性

    例如:5,2,6,4,2,1
    第一轮排序后为:5,2,1,4,2,6
    第二轮排序后为:2,2,1,4,5,6
    此时两个相同元素2的位置已经发生颠倒,所以选择排序是不稳定的

  • 相关阅读:
    25.大白话说java并发工具类-CountDownLatch,CyclicBarrier,Semaphore,Exchanger
    23.FutureTask基本操作总结
    22.线程池之ScheduledThreadPoolExecutor
    Jenkins + SVN搭建php持续集成
    Django学习系列之Form表单结合ajax
    Django学习系列之模板系统
    Django学习系列之路由系统
    zabbix学习系列之基础概念
    Python学习系列之反射
    Django学习系列之模板
  • 原文地址:https://www.cnblogs.com/UnknowCodeMaker/p/11339773.html
Copyright © 2011-2022 走看看