算法_排序算法分析_笔记(一)

_排序算法分析

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

   
    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]<<"\t";
    }
    cout<<endl;
}

 

posted on 2020-06-01 13:37  嗜睡的熊大  阅读(170)  评论(0编辑  收藏  举报

导航