排序算法-查找算法

排序算法

冒泡排序

  1. 从左向右扫描数据,选着最大的数据。
  2. 要点:比较相邻的两个数,如果左边的数大于右边的数就进行交换。

template<class T>

void BubbleSort(T *array, const int length)

{

         for (int i = 0; i <length-1; i++)

         {

                   for (int j = i+1; j <length; j++)

                   {

                            if (array[i]> array[j])

                                     std::swap(array[i], array[j]);

                   }

         }

}

选择排序

  1. 从当前未排序的整数中选着一个最小的整数,将他放在已排序按的整数列表的最后。
  2. 要点:选择排序最小的
  3. 冒泡排序与选择排序

template<class T>

void SelectSort(T *array, const int length)

{

         for (int i = 0; i < length; i++)

         {

                   int min = i;

                   for (int j = i + 1; j < length; j++)

                   {

                            if (array[j] < array[min])

                                     min = j;

                   }

                   std::swap(array[i], array[min]);

         }

}

 

 

 

查找算法

顺序查找

  1. 数据没排序,查找速度慢

template<class T>

int SequentSearch(T *array, const int length,const T x)

{

         int i;

         for (i = 0; i < length; i++)

         {

                   if (array[i] == x)

                            return i;

         }

         return -1;

}

二分查找

  1. 数据需要排序,查找速度快

template<class T>

int BinarySearch(T *array, const int length, const T x)

{

         int low, hight, mid;

         low = 0, hight = length - 1;

 

         while (low <= hight)

         {

                   mid = (low + hight) / 2;

                   if (array[mid] == x)

                            return mid;

                   else if (array[mid] < x)

                            low = mid + 1;

                   else if (array[mid] >x)

                            hight = mid - 1;

         }

         return -1;

}

 

 

 

 

递归算法

  1. 难点:多入口递归算法的实现,递归实现的代码都可以是使用使用循来实现,递归耗费内存,在自己调用自己是,是否应该加return,需要考虑,一般需要加上return。递归算法需要深入研究才能掌握。

递归二分查找算法

template<class T>

int Recursive_BinarySearch(T * array, const int length, const T x,const int left ,const int right)

{

         if (left <= right)

         {

                   int mid = (left + right) / 2;

                   if (x < array[mid])

                            return Recursive_BinarySearch(array, length, x, left, mid - 1);

                           // 注意函数前需要加一个return,没加return,结果不正确

                   else if(x > array[mid])

                            return Recursive_BinarySearch(array, length, x, mid+ 1, right);

                   else return mid;

         }

         return-1;

}

 

递归实现排列组合问题

template<class T>

void Permutations(T * array,int left,int right)

{

         if (left == right)

         {

                   for (int i = 0; i < right; i++)

                            cout << array[i];

                   cout << endl;

         }

         else

         {

                   for (int i = left; i < right; i++)

                   {

                            std::swap(array[left], array[i]);

                            Permutations(array,left+1,right);

                            std::swap(array[left], array[i]);

                   }

         }

}

#include<iostream>
using namespace std;


//排序算法
template<class T> void BubbleSort(T *array, const int length);//冒泡
template<class T> void B_sort(T *array, const int length);
template<class T> void SelectSort(T *array, const int length);//选择

//T *array,使用指针,速度快,传递的数数组的地址,T array[],这种写法为传值,需要大量复制数据

//查找算法
template<class T> int SequentSearch(T *array, const int length, const T x);//顺序查找,没排序的数据
template<class T>int Recursive_BinarySearch(T *array, const int length, const T x,const int left=0,const int right=0);//递归二分查找,排序的数据
template<class T>int BinarySearch(T *array, const int length, const T x);//二分查找,排序的数据
template<class T>void Permutations(T *array,int left,int right);//实现数组中元素的所有组合
int main()
{
	double a[] = { 1.1,1.9,2.5,9.2,9.5,4.0,3.2,4.5,6.7,8.4 };
	BubbleSort(a, 10);		
	cout << "冒泡排序:" << endl;
	for (int i = 0; i < 10; i++)
	{
		cout << a[i] << endl;
	}

	B_sort(a, 10);		
	cout << "冒泡排序:" << endl;
	for (int i = 0; i < 10; i++)
	{
		cout << a[i] << endl;
	}

	int b[] = {5,6,1,4,8,3,6,7,2,9,0 };
	SelectSort(b, 10);		
	cout << "选择排序:" << endl;
	for (int i = 0; i < 10; i++)
	{
		cout << b[i] << endl;
	}

	double x = 4.0;
	int i = SequentSearch(a, 10, x);
	if (i > 0)
	{
		cout << "顺序查找:" << endl;	
		cout << i<<","<<a[i] << endl;
	}

	int y =8;
	int j = BinarySearch(b, 10,y);
	if (j> 0)
		cout << j<< "," << b[j] << endl;

	double z =5;
	int k = Recursive_BinarySearch(a, 10,z,0,10);
	if (k > 0)
	{
		cout << "递归查找:" << endl;
		 cout << k << "," << b[k] << endl;
	}

	char ch[] = { 'a','b','c' };
	cout << "字母组合:" << endl;
	Permutations(ch,0, 3);

	system("pause");
	return 0;
}

template<class T> void BubbleSort(T *array, const int length)
{
	for (int i = 0; i < length; i++)
	{
		for (int j = 0; j < length - 1 - i; j++)
		{
			if(array[j]> array[j+1])
			std::swap(array[j],array[j+1]);
		}
	}
}

template<class T> void B_sort(T *array, const int length)
{
	for (int i = 0; i <length-1; i++)
	{
		for (int j = i+1; j <length; j++)
		{
			if (array[i]> array[j])
				std::swap(array[i], array[j]);
		}
	}
}

template<class T>
void SelectSort(T *array, const int length)
{
	for (int i = 0; i < length; i++)
	{
		int min = i;
		for (int j = i + 1; j < length; j++)
		{
			if (array[j] < array[min])
				min = j;
		}
		std::swap(array[i], array[min]);
	}
}

template<class T>
int SequentSearch(T *array, const int length,const T x)
{
	int i;
	for (i = 0; i < length; i++)
	{
		if (array[i] == x)
			return i;
	}
	return -1;
}

template<class T>
int Recursive_BinarySearch(T * array, const int length, const T x,const int left ,const int right)
{
	if (left <= right)
	{
		int mid = (left + right) / 2;
		if (x < array[mid])
			return Recursive_BinarySearch(array, length, x, left, mid - 1);// 注意函数前需要加一个return,没加return,结果不正确
		else if(x > array[mid])
			return Recursive_BinarySearch(array, length, x, mid+ 1, right);
		else return mid;
	}
	return-1;
}

template<class T>
int BinarySearch(T *array, const int length, const T x)
{
	int low, hight, mid;
	low = 0, hight = length - 1;

	while (low <= hight)
	{
		mid = (low + hight) / 2;
		if (array[mid] == x)
			return mid;
		else if (array[mid] < x)
			low = mid + 1;
		else if (array[mid] >x)
			hight = mid - 1;
	}
	return -1;
}

template<class T>
void Permutations(T * array,int left,int right)
{
	if (left == right)
	{
		for (int i = 0; i < right; i++)
			cout << array[i];
		cout << endl;
	}
	else
	{
		for (int i = left; i < right; i++)
		{
			std::swap(array[left], array[i]);
			Permutations(array,left+1,right);
			std::swap(array[left], array[i]);
		}
	}
}

结果:

 

 

 

 

 

 

 

 

 

发布了89 篇原创文章 · 获赞 8 · 访问量 8891

猜你喜欢

转载自blog.csdn.net/TxyITxs/article/details/101785804