zoukankan      html  css  js  c++  java
  • 算法_排序算法分析_笔记(一)

    _排序算法分析

     排序算法:通过调换位置让一组数据拥有某种次序关系的方法或规则。

       
        1、排序算法特点
            大多数排序算法包含两个基础操作:
               (1)、比较两个数据元素的大小  -------------- 比较
               (2)、改变指向数据的指针或移动数据本身  ---- 交换
       
           对数据进行扩展 --- 数据 -->记录 --> 按关键值排序
                              -->对象---> 按属性排序
                                 
     2、排序算法的分析  --- 尺
        排序算法的分析一般从下面三个角度进行分析/欣赏:
       
        A、算法稳定性  -- 排序算法是否为稳定的是由具体算法决定的。
             通俗地讲就是能保证:2个相等的数其在排序前后的他们相对位置不变。  
        在简单形式化一下,如果Ai = Aj, Ai原来在Aj位置前,
              排序后Ai还是要在Aj位置前。 
       
        B、算法的时间复杂度
           如排序问题的规模大小(n),一般而言,好的性能是 O(nlogn)
        且坏的性能是 O(n^2)。对于一个排序理想的性能是 O(n)。
       
        C、算法的空间复杂度
           如排序问题的规模大小(n),一般而言,排序算法空间复杂度为:O(1)或O(n)
     
        3、排序算法的分类
        为了达到排序的目的,对序列中的数据采用的动作有:比较、插入、交换、选择、合并等等。
        根据排序算法采用主要动作,算法分类如下;
         交换排序--- 包含冒泡排序、快速排序等;
         插入排序--- 包含直接插入排序、希尔(shell)排序等;
         选择排序--- 包括堆排序等。

    C++ 实现常用的几种算法(冒泡排序,快速排序,直接插入排序,二分查找算法,递归算法)

    sort.h

    #include <iostream>
    using namespace std;
    
    void BubbleSort(int* pArray, int length);
    void QuickSort(int array[], int lowNum, int highNum);
    void InsertSort(int array[], int length);
    
    void printArray(int array[], int length);
    
    class student
    {
    public:
        virtual void test()=0
        {
            cout<<"test"<<endl;
        }
    };

    sort.cpp

    #include "sort.h"
    
    //冒泡
    void BubbleSort(int* pArray,int length)
    {
        for (int i=0;i< length-1;i++)
        {
            for (int j=0;j< length - i - 1;j++)
            {
                if (pArray[j]  >pArray[j + 1])
                {
                    int temp = pArray[j];
                    pArray[j] = pArray[j + 1];
                    pArray[j + 1] = temp;
                }
            }
        }
    }
    //交换
    void swap(int& num1, int& num2)
    {
        int tmp = num1;
        num1 = num2;
        num2 = tmp;
    }
    
    //快速排序
    void QuickSort(int pArray[],int lowNum,int highNum)
    {
        //如果开始排序时,上下限范围相等,则返回
        if(lowNum >= highNum)
        {
            return;
        }
    
        //新建左右 下标,初值为 上下限。
        int left = lowNum;    
        int right = highNum;
    
        //用left下标 对应的数组值 作为 关键值
        int key = pArray[left]; 
    
        //当左右 下标相等时,本趟比较结束
        while(left < right)
        {
            //从右到左,找到第一个小于 key值的下标
            while (left < right && pArray[right] >= key)
            {
                right--;
            }
    
            swap(pArray[right], pArray[left]);
    
            //从左到右,找到第一个大于 key值的下标
            while (left < right && pArray[left] <= key)
            {
                left++;
            }
    
            swap(pArray[left], pArray[right]);
        }
    
        QuickSort(pArray, lowNum, left - 1);
        QuickSort(pArray, left + 1, highNum);
    }
    
    
    //直接插入排序
    void InsertSort(int pArray[], int length)
    {  
        for(int i = 1; i < length;i++)
        {
            //从当前被选取的元素位置开始,往前遍历,找到第一个比他小的元素
            for(int j = i ; j > 0; j--) 
            {
                if (pArray[j - 1] > pArray[j])
                {
                    int tmp = pArray[j - 1];
                    pArray[j - 1] = pArray[j];
                    pArray[j] = tmp;
                }
                else
                {
                    break;
                }
            }
        }
    }  
    
    void printArray(int array[], int n)
    {
        for (int i=0;i<n;i++)
        {
            cout<<array[i]<<"	";
        }
        cout<<endl;
    }
  • 相关阅读:
    Spring Boot Common application properties(转载)
    SVN中trunk,branches,tags用法详解(转载)
    约定优于配置
    JavaScript封装一个MyAlert弹出框
    JavaScript封装一个实用的select控件
    JavaScript的8行代码搞定js文件引入问题
    JavaScript处理数据完成左侧二级菜单的搭建
    SpringMVC+Mybatis实现的Mysql分页数据查询
    十步完全理解 SQL(转载)
    sql语句练习50题
  • 原文地址:https://www.cnblogs.com/Roz-001/p/13024736.html
Copyright © 2011-2022 走看看