今年找工作的过程中,笔试面试没少遇到排序算法,自以为熟记于心,但一写到纸上,就连自己都看不下去,唉!!这几天,我好好的把排序算法总结了一下,重新编程运行了,而且写成博客,希望以后找工作的同学们能及早修炼内功,切勿重蹈小弟的覆辙!
下面是插入排序、选择排序和冒泡排序的递归和非递归程序,时间复杂度都是O(n2),空间复杂度都是O(1), 都是稳定的,都是原址排序。这些排序算法比较简单,因此统称简单排序算法。但是一定不能小看,有许多细节需要注意,因此希望修炼的同学一定要自己动手写写。
小弟菜鸟,多多评论!
#ifndef SIMPLE_SORT
#define SIMPLE_SORT
#include <algorithm>
using namespace std;
#define ASSERT(A) if(!A){return;}
/*************插入排序*************/
//非递归插入排序
void insertionSort(int *A, int n)
{
ASSERT(A);
for (int i=1; i<n; i++)
{
int key = A[i], j = i-1;
while(j>=0 && A[j] > key)
{
A[j+1] = A[j];
j--;
}
A[j+1] = key;
}
}
void insert(int *A, int m)
{
int i=m-1, key = A[m];
while(i>=0 && A[i] > key)
{
A[i+1] = A[i];
i--;
}
A[i+1] = key;
}
//递归插入排序:要将第m个数插入到合适位置,得先排序A[1:m-1]
void insertSort(int *A, int m)
{
if (m > 0)
{
insertSort(A, m-1);
insert(A, m);
}
}
/*************选择排序*************/
//非递归选择排序
void selectionSort(int *A, int n)
{
ASSERT(A);
for (int i=0; i<n-1; i++)
{
int min = i;
for(int j=i+1; j<n; j++)//在A[i+1:n-1]中找最小的元素
{
if (A[j]<A[min])
min = j;
}
if (min != i)
swap(A[min], A[i]);
}
}
void select(int *A, int low, int high)
{
int min=low;
for(int i=low+1; i<=high; i++)
{
if (A[i]<A[min])
min = i;
}
swap(A[min], A[low]);
}
//递归选择排序:要将第m个最小的数选出,得先将A[1:m-1]排序
void selectionSort(int *A, int m, int n)
{
if (m>=0)
{
selectionSort(A, m-1, n);
select(A, m, n-1);
}
}
/*************冒泡排序*************/
//非递归冒泡排序
void bubbleSort(int *A, int n)
{
ASSERT(A);
for(int i=1; i<n; i++)
{
for (int j=n-1; j>=i; j--)
{
if (A[j]<A[j-1])
swap(A[j], A[j-1]);
}
}
}
void bubble(int *A, int low, int high)
{
for (int i=high; i>low; i--)
{
if (A[i]<A[i-1])
swap(A[i], A[i-1]);
}
}
//冒泡排序递归:要冒第m个泡,得排序A[1:m-1]
void bubbleSort(int *A, int m, int n)
{
if (m >= 0)
{
bubbleSort(A, m-1, n);
bubble(A, m, n-1);
}
}
#endif