算法基本知识学习之排序算法

本博客主要记录我在学习,巩固算法基本知识时的心得体会以及代码。

最近进行的是对排序算法的学习与练习。

-冒泡排序,选择排序,插入排序

  这三种排序算法都是按照一定的顺序进行比较,然后确定一个数据的位置。在写算法的过程中要明确如何比较,以及数据是按什么顺序确定的。主要通过双层循环实现。在这个过程当中,接触到了一个重要的概念:“稳定性”。所谓稳定性,就是指在一个待排序的队列中,值相等的两个数在排序之后相对位置是否发生了变化。如果没有发生变化,则是具有稳定性,反之,不具有稳定性。


-归并排序

  归并排序是基于“分治”的思想。在我理解就是将一个待排序的数据不断的进行二分,直至不可再分。然后在一层层的收上来,收的过程就是排序的过程,即在每一层通过比较两个子数组中数据的大小来合并这两个子数组。合并之后的数据是已排好序的数据。

  其实就是递归的应用,一层层的递归就是数组的分之;之后的返回就是数组的合并。

  其中在实现的过程中,我是利用指针在一个数据中进行分之与之后的合并排序,因此很容易就犯了“将具有相同指针的变量之一改了之后,忘记另外一个变量所指向的值也会发生变动”。这个Bug调了很久才发现。所以以后在应用指针时,要注意在指针传动时,对那些指向相同内容的值的操作。具体代码如下:

#include<iostream>
using namespace std;

class MergeSort
{
public:
 int* mergeSort(int* A, int n)
 {
  //Code write here
  if(n==2)
            {
            if(A[0]>A[1])
                {
                int a = A[1];
                A[1] = A[0];
                A[0] = a;
            }
            return A;
        }
        else if(n==1)
            {
            return A;
        }
        else
            {
            int mid = n/2;
            int left = 0, right = 0;
            int* left_A = mergeSort(A, mid);
            int* right_A = mergeSort(&A[mid], n-mid);
            for(int i=mid; i<n; i++)
   {
    for(int j=i-1; j>=0; j--)
    {
     if(A[j+1]<A[j])
     {
      int a = A[j];
      A[j]  = A[j+1];
      A[j+1] = a;
     }
    }
   }
            return A;
        }
    };
 };

int main()
{
 int A[13] = {54,35,48,36,27,12,44,44,8,14,26,17,28};
 MergeSort mergesort;
 mergesort.mergeSort(A, 13);
 for(int i=0; i<13; i++)
 {
  if(i==12)
      cout<<A[i];
  else
   cout<<A[i]<<' ';
 }
 return 0;
}


-快速排序

  快速排序也是一种基于“分治”思想的排序算法。与归并排序相比,相同点在于它们都是通过递归来不断的将一个数组进行分之;而不同在于,归并排序在排序的过程中,获得的每一个子数组都是已经排好序的数组,而快速排序在排序的过程中,每一个子并不是排好序的数组,它仅是进行了分类,直至最后才将整个数据排好序。

  其中在练习的过程中,有几个关键点:

    1.在应用递归时,首先要确定的是终止条件。递归如何终止,终止代码的位置在哪里比较合适。

    2.快速排序是定数,而非定位置。以前我错误的理解成是定位置。

    3.在移动的过程中,我总结为就是:“基数等于哪个位置的变量,就固定哪个位置,移动另外一个位置”。

    4.当左右“游标”相等时,当前数组的分类就完成了。

具体代码如下:

#include<iostream>
using namespace std;

class QuickSort
{
public:
    int quickSort(int* A, int n)
    {
        //Code write here
            int base = A[0], i = 0, j = n - 1;
            while (i != j)
            {
                if (base == A[i])
                {
                    if (A[j]<base)
                    {
                        int a = A[i];
                        A[i] = A[j];
                        A[j] = a;
                        base = A[j];
                    }
                    else
                    {
                        j--;
                    }
                }
                else if (base == A[j])
                {
                    if (A[i]>base)
                    {
                        int a = A[j];
                        A[j] = A[i];
                        A[i] = a;
                        base = A[i];
                    }
                    else
                    {
                        i++;
                    }
                }
            }
            if (i != 0)
            {
                quickSort(&A[0], i);
            }
            if (i != n - 1)
            {
                quickSort(&A[i + 1], n - 1 - i);
            }
            return 0;
    };
};
void main()
{
    int A[13] = { 100, 6, 34, 6, 3, 2, -1 };
    QuickSort QS;
    QS.quickSort(A, 7);
    for (int i = 0; i < 7; i++)
    {
        if (i == 6)
        {
            cout << A[i];
        }
        else
        {
            cout << A[i] << ' ';
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值