本博客主要记录我在学习,巩固算法基本知识时的心得体会以及代码。
最近进行的是对排序算法的学习与练习。
-冒泡排序,选择排序,插入排序
这三种排序算法都是按照一定的顺序进行比较,然后确定一个数据的位置。在写算法的过程中要明确如何比较,以及数据是按什么顺序确定的。主要通过双层循环实现。在这个过程当中,接触到了一个重要的概念:“稳定性”。所谓稳定性,就是指在一个待排序的队列中,值相等的两个数在排序之后相对位置是否发生了变化。如果没有发生变化,则是具有稳定性,反之,不具有稳定性。
-归并排序
归并排序是基于“分治”的思想。在我理解就是将一个待排序的数据不断的进行二分,直至不可再分。然后在一层层的收上来,收的过程就是排序的过程,即在每一层通过比较两个子数组中数据的大小来合并这两个子数组。合并之后的数据是已排好序的数据。
其实就是递归的应用,一层层的递归就是数组的分之;之后的返回就是数组的合并。
其中在实现的过程中,我是利用指针在一个数据中进行分之与之后的合并排序,因此很容易就犯了“将具有相同指针的变量之一改了之后,忘记另外一个变量所指向的值也会发生变动”。这个Bug调了很久才发现。所以以后在应用指针时,要注意在指针传动时,对那些指向相同内容的值的操作。具体代码如下:
using namespace std;
{
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 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] << ' ';
}
}
}