程序猿找工作必练内功:排序算法大总结(一)——简单排序算法

本文详细介绍了插入排序、选择排序和冒泡排序的递归和非递归实现,强调了排序算法的基础知识和注意事项。通过实践编程和撰写博客,作者希望帮助读者掌握这些简单排序算法,避免常见的编程错误。

今年找工作的过程中,笔试面试没少遇到排序算法,自以为熟记于心,但一写到纸上,就连自己都看不下去,唉!!这几天,我好好的把排序算法总结了一下,重新编程运行了,而且写成博客,希望以后找工作的同学们能及早修炼内功,切勿重蹈小弟的覆辙!

下面是插入排序、选择排序和冒泡排序的递归和非递归程序,时间复杂度都是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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值