各种常见排序算法归纳总结

class sort_algorithm
{
public:
	int array[MAXN];
	int n;
public:
	sort_algorithm() { }
	~sort_algorithm() { }
	/*插入排序 复杂度O(n^2) 稳定排序*/
	void Insertion_sort()
	{
		for (int i = 2; i <= n; i++)
		{
			int key = array[i];
			int j = i - 1;
			while (j >= 1 && array[j] > key)
			{
				array[j + 1] = array[j];
				j--;
			}
			array[j + 1] = key;
		}
	}
	//希尔排序 复杂度 O(nlog^2 n) 不稳定排序
	void shell_sort()
	{
		for (int gap = n / 2; gap >= 1; gap >>= 1)
		{
			for (int i = gap; i <= n; i++)
			{
				int key = array[i];
				int j = i - gap;
				while (j >= 1 && array[j] > key)
				{
					array[j + gap] = array[j];
					j -= gap;
				}
				array[j + gap] = key;
			}
		}
	}
	/*冒泡排序 复杂度O(n^2) 稳定排序*/
	void bubble_sort()
	{
		for (int i = n; i >= 2; i--)
		{
			for (int j = 1; j <= i - 1; j++)
			{
				if (array[j + 1] < array[j])
					swap(array[j], array[j + 1]);
			}
		}
	}
	/*优化版冒泡排序 复杂度O(n^2) 稳定排序*/
	void bubble_sort2()
	{
		int bound = n;
		while (bound != 0)
		{
			int t = 0;
			for (int i = 1; i <= bound - 1; i++)
			{
				if (array[i] > array[i + 1])
					swap(array[i], array[i + 1]);
				t = i;
			}
			bound = t;
		}
	}
	/*选择排序 复杂度O(n^2) 不稳定排序*/
	void select_sort()
	{
		for (int i = n; i >= 2; i--)
		{
			int t = 1;
			for (int j = 2; j <= i; j++)
			{
				if (array[t] < array[j])
					t = j;
			}
			swap(array[t], array[i]);
		}
	}
	/*归并排序 复杂度O(logn) 稳定排序*/
	void merge(int l, int mid, int r)
	{
		int i = l, j = mid + 1;
		int n = mid, m = r;
		int k = 0;
		int temp[MAXN];
		while (i <= n && j <= m)
		{
			if (array[i] <= array[j])
				temp[k++]= array[i++];
			else temp[k++] = array[j++];
		}
		while (i <= n) temp[k++] = array[i++];
		while (j <= m) temp[k++] = array[j++];
		for (i = 0; i < k;i++)
			array[l + i] = temp[i];
	}
	void merge_sort(int l, int r)
	{
		if (l < r)
		{
			int m = (l + r) >> 1;
			merge_sort(l, m);
			merge_sort(m + 1, r);
			merge(l, m, r);
		}
	}
	/*堆排序 复杂度 O(logn) 不稳定排序*/
	void heapadjust(int i,int size)
	{//建立递增序列,使用大根堆
		int lson = i << 1;
		int rson = i << 1|1;
		int mx = i;
		if(i <= size / 2)
		{
			if (lson <= size && array[lson] > array[mx])
				mx = lson;
			if (rson <= size && array[rson] > array[mx])
				mx = rson;
			if (mx != i)
			{
				swap(array[i], array[mx]);
				heapadjust(mx,size);
			}
		}
	}
	void buildheap()
	{
		for (int i = n / 2; i >= 1; i--)
		{
			heapadjust(i, n);
		}
	}
	void heap_sort()
	{
		buildheap();
		for (int i = n; i >= 1; i--)
		{
			swap(array[1], array[i]);
			heapadjust(1, i-1);
		}
	}
	/*快速排序 复杂度O(logn) 不稳定排序*/
	void quick_sort(int l, int r)
	{
		if (l < r)
		{
			int i = l, j = r, x = array[l];
			while (i < j)
			{
				while (i < j && array[j] >= x) j--;
				if (i < j) array[i++] = array[j];
				while (i < j && array[i] < x) i++;
				if (i < j) array[j--] = array[i];
			}
			array[i] = x;
			quick_sort(l, i-1);
			quick_sort(i + 1, r);
		}
	}
};
istream &operator >> (istream &is, sort_algorithm &item)
{
	is >> item.n;
	for (int i = 1; i <= item.n; i++)
		is >> item.array[i];
	return is;
}
ostream &operator << (ostream &os, const sort_algorithm &item)
{
	os << item.n << endl;
	for (int i = 1; i <= item.n; i++)
		os << item.array[i] << ' ';
	os << endl;
	return os;
}

时间: 2024-12-07 00:43:55

各种常见排序算法归纳总结的相关文章

常见排序算法(一) MergeSort

算法思想灰常重要,常见的用到分治思想的算法包括快速排序,归并,二分搜搜,大整数乘法等(参考 http://blog.csdn.net/com_stu_zhang/article/details/7233761,归纳很到位) 简单用归并对一个数组排序 思路: 简单来说对一个数组,只要他的左右两部分都是有序的,那么简单合并就ok了,那么左右两部分可以进一步划分各自的左右两部分----明显就是要递归了 算法:归并排序 1. 将数组一分为二,subArray1 和subArray2 2. 归并排序sub

【整理】常见排序算法及其时间复杂度总结

原文出处: 1. 白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇 2. 面试常用算法总结--排序算法(java版) 3. 常见排序算法小结 本篇主要整理了冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序,堆排序七种常见算法,是从上面三篇博文中摘抄整理的,非原创. 一.冒泡排序 主要思路是: 通过交换相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就"沉"到最后面了.重复N次即可以使数组有序. 冒泡排序改进1: 在某次遍历中,如果没有

常见排序算法(java实现)

常见排序算法介绍 冒泡排序 代码: public class BubbleSort { public static void sort(int[] array) { int tValue; for (int i = 0; i < array.length; i++) { for (int j = i; j < array.length; j++) { if (array[i] > array[j]) { tValue = array[i]; array[i] = array[j]; ar

常见排序算法(冒泡、选择、插入、快速、归并C++实现)

常见排序算法(冒泡.选择.插入.快速.归并C++实现) #include <iostream> using namespace std; // 冒泡排序 void bubbleSort (int data[], size_t size) { for (size_t i = 0; i < size - 1; ++i) { bool ordered = true; for (size_t j = 0; j < size - 1 - i; ++j) if (data[j+1] <

几种常见排序算法

几种常见排序算法 几种常见排序算法 写在前面 基础介绍 初级排序算法 selection sort选择排序 insertion sort插入排序 ShellSort希尔排序 shuffing不是排序算法 merge sort归并排序 Abstract in-place merge原地归并的抽象方法 Top-down mergesort自顶向下的归并排序 Bottom-up mergesort自底向上的归并排序 quicksort 三向切分的快速排序 Heapsort堆排序 总结和比较 命题 本文

第六章 常见排序算法

上章回顾 二叉树的定义 树深度的定义 什么样的二叉树是满二叉树 中序遍历的规则 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 第六章 第六章 常见排序算法 常见排序算法 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorith

常见排序算法总结(java实现)

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.常见的排序算法有选择排序,插入排序,希尔排序,归并排序和快速排序 由于在排序的过程中不可避免的要涉及到比较和交换,所以将他们抽取为两个单独的函数,如下所示 //为了排序代码的通用性,这里假定待排序的元素实现了Comparable接口 private static boolean less(Comparable v ,Comparable w){ return v.compareTo(w)<0; } priva

十种常见排序算法

1.常见算法分类 十种常见排序算法一般分为以下几种: (1)非线性时间比较类排序:交换类排序(快速排序和冒泡排序).插入类排序(简单插入排序和希尔排序).选择类排序(简单选择排序和堆排序).归并排序(二路归并排序和多路归并排序): (2)线性时间非比较类排序:计数排序.基数排序和桶排序. 总结: (1)在比较类排序中,归并排序号称最快,其次是快速排序和堆排序,两者不相伯仲,但是有一点需要注意,数据初始排序状态对堆排序不会产生太大的影响,而快速排序却恰恰相反. (2)线性时间非比较类排序一般要优于

常见排序算法(PHP实现)

function InsertSort($arr){ $num = count($arr); for($i = 1; $i < $num; $i++){ $key = $arr[$i]; for($j = $i - 1; $j >= 0; $j--){ if($arr[$j] > $key){ $arr[$j + 1] = $arr[$j]; $arr[$j] = $key; } } } return $arr; } function BubbleSort($arr){ $num = c