算法——冒泡排序、選擇排序、插入排序的算法思想+C++代碼實現+時間空間複雜度

一、冒泡排序


1、排序思想:假設對N個數進行排序,他們的位置分別是0、1、2....、N-1。首先比較0和1位置上的元素,如果0位置上的元素大於1位置上的元素,則交換兩個位置上的元素,否則不做調整;接着比較1位置上和2位置上的元素,如果1位置上的元素大於2位置上的元素,則交換兩個位置上的元素,否則不交換;..........;最後比較N-2和N-1位置上的元素,如果N-2位置上的元素大於N-1位置上的元素,則交換兩個位置上的元素,這樣經過一趟排序,最大的數就在N-1位置上。接着在0-N-2位置上繼續遍歷找出第二大的數放在N-2位置上,以此類推,從而得到一個升序排序序列。

2、代碼實現

#include<iostream>
using namespace std;

template<typename T>
void bubble_sort(T list[], int len)     //冒泡升序排序
{
	for (int i = len - 1; i > 0; i--)
	{
		for (int j = 0; j < i; j++)
		{
			if (list[j] > list[j + 1])
				bubble_swap(list[j], list[j + 1]);
		}
	}
}

template<typename T>   //使用到T的地方都需要加template
void bubble_swap(T &x, T &y)   //交換兩個位置上的元素
{
	T temp;
	temp = x;
	x = y;
	y = temp;
}

int main()
{
	int nums[] = { 12,3,2,4,56,13,23,34,55 };
	int len = (int) sizeof(nums) / sizeof(int);
	bubble_sort(nums, len);
	for (int i = 0; i < len; i++)
	{
		cout << nums[i]<<' ';
	}
	cout << endl;
	system("pause");
	return 0;
}

3、時間複雜度和空間複雜度

  • 時間複雜度:O(N^{2})
  • 空間複雜度:O(1)

二、選擇排序


1、排序思想:每一趟從待排序的記錄中選出最小的元素,順序放在已排好序的序列最後,直到全部記錄排序完畢。也就是:每一趟在n-i+1(i=1,2,…n-1)個記錄中選取關鍵字最小的記錄作爲有序序列中第i個記錄。

2、代碼實現

#include<iostream>
using namespace std;

template<typename T>
void select_sort(T list[], int len)     //選擇排序:升序
{
	for (int i = 0; i < len - 1; i++)
	{
		int minIndex = i;   //記錄最小元素的下標
		for (int j = i+1; j < len; j++)
		{
			minIndex = list[j] < list[minIndex] ? j : minIndex;
		}
		select_swap(list[i], list[minIndex]);
	}
}

template<typename T>   //使用到T的地方都需要加template
void select_swap(T &x, T &y)   //交換兩個位置上的元素
{
	T temp;
	temp = x;
	x = y;
	y = temp;
}

int main()
{
	int nums[] = { 12,3,2,4,56,13,23,34,55 };
	int len = (int) sizeof(nums) / sizeof(int);
	select_sort(nums, len);
	for (int i = 0; i < len; i++)
	{
		cout << nums[i]<<' ';
	}
	cout << endl;
	system("pause");
	return 0;
}

3、時間和空間複雜度

  • 時間複雜度:O(N^{2})
  • 空間複雜度:O(1)

三、插入排序


1、排序思想:把幾個待排序的元素看成一個有序表和一個無序表,開始時有序表中只包含一個元素,假設序列第一個元素爲有序表,其餘都在無序表中,排序過程中,每次從無序表中取出第一個元素,將他與有序表中的元素進行比較,放到合適位置,使得插入該元素後的有序表仍就有序,即得到新的有序表;按照上述過程,逐個將無序表中的元素放到有序表中。

2、代碼實現

#include<iostream>
using namespace std;

template<typename T>
void insert_sort(T list[], int len)     
{
	for (int i = 1; i < len; i++)
	{
		for (int j = i-1; j >=0 && list[j] > list[j+1]; j--)  //無序表中的第一個元素小於比較的元素就交換位置
		{
			insert_swap(list[j], list[j + 1]);
		}
	}
}

template<typename T>   //使用到T的地方都需要加template
void insert_swap(T &x, T &y)   //交換兩個位置上的元素
{
	x = x^y;    //炫酷的交換兩個元素的寫法
	y = x^y;
	x = x^y;
}

int main()
{
	int nums[] = { 12,3,2,4,56,13,23,34,55 };
	int len = (int) sizeof(nums) / sizeof(int);
	insert_sort(nums, len);
	for (int i = 0; i < len; i++)
	{
		cout << nums[i]<<' ';
	}
	cout << endl;
	system("pause");
	return 0;
}

3、時間和空間複雜度(複雜度和序列原始狀況有關

  • 原序列是升序序列:
    • 時間複雜度:O(N)
    • 空間複雜度:O(1)
  • 原序列是降序序列:
    • 時間複雜度:O(N^{2})
    • 空間複雜度:O(1)

注意:如果時間複雜度與序列狀況有關,則時間複雜度取最差情況下的時間複雜度


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章