左神算法基础class1——例子3、4、5冒泡,选择、插入排序

左神算法基础class1——例子3、4、5冒泡,选择、插入排序

  • 冒泡排序
    • 题目:冒泡排序细节的讲解与复杂度分析
    • 分析
    • 完整代码
  • 选择排序
    • 题目:选择排序细节的讲解与复杂度分析
    • 分析
    • 完整代码
  • 插入排序(很有用)
    • 题目:插入排序细节的讲解与复杂度分析
    • 分析
    • 完整代码

冒泡排序

题目:冒泡排序细节的讲解与复杂度分析

时间复杂度O(N^2),额外空间复杂度O(1)

分析

外侧for循环for(int i = 0;i < B_MAX - 1;i++),例如5个数需要循环4次,四个定了最后一个也定了,内侧循环对比j和j+1相邻的数for (int j = 0;j < B_MAX - 1 - i;j++),由于数组j < B_MAX-1j+1可以达到b[B_MAX - 1]数组最后一个数,而j < B_MAX - 1 - i可以省略已经排好的再排一遍。

for(int i = 0;i < B_MAX-1;i++)
	{
     
		for (int j = 0;j < B_MAX-1-i;j++)
		{
     
			if(b[j] > b[j+1])
			{
     
				exchange(b[j],b[j+1]);
			}
		}
	}

完整代码

使用断点查看

#include 

#include
#define B_MAX 7
using namespace std;

void exchange(int &x,int &y)
{
     
	int temp = x;
	x = y;
	y = temp;
}


int main()
{
     
	srand((unsigned)time(NULL));
	int b[B_MAX];
	//cout<<"b=  ";
	for(int i = 0;i < B_MAX;i++)
	{
     
		b[i] = rand()%10;
		//cout<
	}
	//cout<

	for(int i = 0;i < B_MAX-1;i++)
	{
     
		for (int j = 0;j < B_MAX-1-i;j++)
		{
     
			if(b[j] > b[j+1])
			{
     
				exchange(b[j],b[j+1]);
			}
		}
	}
	system("pause");
	return 0;
}

选择排序

题目:选择排序细节的讲解与复杂度分析

时间复杂度O(N^2),额外空间复杂度O(1)

分析

两层for循环,外层是最小值开头的位置for(int i = 0;i < B_MAX-1;i++)N个数,只用N-1个,最后一个自然确定所以j < B_MAX-1。内层for循环找最小值位置for (int j = i + 1;j < B_MAX ;j++),必须全部遍历,所以为j < B_MAX

for(int i = 0;i < B_MAX-1;i++)
	{
     
		int min = i;
		for (int j = i + 1;j < B_MAX ;j++)
		{
     
			/*if(b[j] < b[min])
			{
				exchange(b[j],b[min]);
			}*/
			min = b[j] < b[min] ? j : min;

		}
		exchange(b[i],b[min]);
	}

完整代码

#include 
#include
#define B_MAX 7
using namespace std;

void exchange(int &x,int &y)
{
     
	int temp = x;
	x = y;
	y = temp;
}


int main()
{
     
	srand((unsigned)time(NULL));
	int b[B_MAX];
	//cout<<"b=  ";
	for(int i = 0;i < B_MAX;i++)
	{
     
		b[i] = rand()%10;
		//cout<
	}
	//cout<

	for(int i = 0;i < B_MAX-1;i++)
	{
     
		int min = i;
		for (int j = i + 1;j < B_MAX ;j++)
		{
     
			min = b[j] < b[min] ? j : min;
		}
		exchange(b[i],b[min]);
	}


	system("pause");
	return 0;
}

插入排序(很有用)

题目:插入排序细节的讲解与复杂度分析

时间复杂度O(N^2),最好情况O(N)与数据状况有关,额外空间复杂度O(1)

分析

像扑克牌插入一样,两for循环,外侧for循环表示当前(插入)的位置,默认0号位置已经排好从1开始,则for(int i = 1;i < B_MAX;i++),内侧循环进行排序for(int j = i-1;j>=0 && b[j] > b[j+1];j--),第一个从1号位置和0号位置开始j和j+1比较。
左神算法基础class1——例子3、4、5冒泡,选择、插入排序_第1张图片
保证不越界并判断是否放好j>=0 && b[j] > b[j+1]

完整代码

#include 
#include
#define B_MAX 7
using namespace std;

void exchange(int &x,int &y)
{
     
	int temp = x;
	x = y;
	y = temp;
}


int main()
{
     
	srand((unsigned)time(NULL));
	int b[B_MAX];
	//cout<<"b=  ";
	for(int i = 0;i < B_MAX;i++)
	{
     
		b[i] = rand()%10;
		//cout<
	}
	//cout<

	for(int i = 1;i < B_MAX;i++)//每个数都需要考察,第一个位置默认排好
	{
     
		for(int j = i-1;j>=0 && b[j] > b[j+1];j--)
		{
     
			exchange(b[j],b[j+1]);
		}
	}


	system("pause");
	return 0;
}```

你可能感兴趣的:(左神算法基础课,冒泡排序,选择排序,插入排序,算法与数据结构,c++)