排序大汇总

1.归并排序

void merge(int *result, int begin, int mid, int end, int *temp)
{
	int k = begin;
	int i = begin;
	int j = mid + 1;
	while (i <= mid&&j <= end){
		temp[k++] = result[i] < result[j] ? result[i++] : result[j++];
	}

	while (i <= mid)
		temp[k++] = result[i++];
	while (j <= end)
		temp[k++] = result[j++];
	for (int t = begin; t <= end; t++)
		result[t] = temp[t];

}

void mergeSort(int *result, int begin, int end, int *temp)
{
	if (begin < end){
		int mid = (end - begin) / 2 + begin;
		mergeSort(result, begin, mid, temp);
		mergeSort(result, mid + 1, end, temp);
		merge(result, begin, mid, end, temp);
	}
}

2.快速排序

int partition(int *result, int begin, int end)
{
	int temp = result[begin];
	int low = begin;
	int high = end;
	while (low < high){
		while (low < high&&result[high] > temp)
			high--;
		if (low < high)
			result[low++] = result[high];

		while (low < high&&result[low] < temp)
			low++;
		if (low < high)
			result[high--] = result[low];
	}
	result[low] = temp;
	return low;
}

void quickSort(int *result, int begin, int end)
{
	if (begin < end){
		int k = partition(result, begin, end);
		quickSort(result, begin, k - 1);
		quickSort(result, k + 1, end);
	}
}

3.插入排序

void insertSort(int *a, int length)
{
	for (int i = 1; i < length; i++){
		int temp = a[i];
		int j = i - 1;
		while (j >= 0 && a[j] > temp){
			a[j + 1] = a[j];
			j--;
		}
		a[j + 1] = temp;
	}
}

4.冒泡排序

void bubbleSort(int *a, int length)
{
	for (int i = length - 1; i >= 0; i--){
		for (int j = 0; j < i; j++){
			if (a[j]>a[j + 1]){
				//swap(a[j], a[j + 1]);
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
}

5.希尔排序

void shellSort(int *a, int length)
{
	for (int i = length / 2; i >= 1; i = i / 2){
		for (int j = i; j < length; j++){
			int k = j - i;
			int temp = a[j];
			while (k >= 0 && a[k] > temp){
				a[k + i] = a[k];
				k -= i;
			}
			a[k + i] = temp;
		}
	}
}

6.堆排序

void heapAdjust(int *a, int k, int n)
{
	int lhc, rhc;
	int index = k;
	while (k < n / 2){
		lhc = 2 * k + 1;
		rhc = lhc + 1;
		if (lhc<n&&a[lhc]>a[index]){
			index = lhc;
		}
		if (rhc<n&&a[rhc]>a[index]){
			index = rhc;
		}
		if (index == k){
			break;
		}
		else {
			//swap(a[k], a[index]);
			int temp = a[k];
			a[k] = a[index];
			a[index] = temp;
			k = index;
		}

	}
}

void heapSort(int *a, int n)
{
	for (int i = n / 2 - 1; i >= 0; i--){
		heapAdjust(a, i, n);
	}
	for (int i = n - 1; i >= 1; i--){
		//swap(a[i], a[0]);
		int temp = a[i];
		a[i] = a[0];
		a[0] = temp;
		heapAdjust(a, 0, i);
	}

}

7.测试程序

int main(void)
{
	srand(time(NULL));
	const int size = 10000000;

	//int a[9] = { 64 ,45 ,76, 28 ,74 ,38, 88 ,92, 34 };
	clock_t start, end;
	int *a = new int[size];
	int *b = new int[size];
	int *c = new int[size];
	int *temp = new int[size];
	for (int i = 0; i < size; i++){
		c[i] = b[i] = a[i] = rand() % 2534541;
		//	cout << a[i] << " ";
	}
	//cout << endl;
	start = clock();
	//mergeSort(c, 0, size - 1,temp);
	//priority_queue<int> que(c, c + size);
	heapSort(c, size);
	//bubbleSort(c, size);
	//sort(c, c + size);
	//stable_sort(c, c + size);
	//qsort(a, size, sizeof(int), cmp);
	end = clock();
	cout << "heapSort:" << end - start << " ms" << endl;
	start = clock();
	//mergeSort(a, 0, size - 1, temp);
	//insertSort(a, size);
	//bubbleSort(a, size);
	shellSort(a, size);
	end = clock();
	cout << "shellSort:" << end - start << " ms" << endl;
	start = clock();
	quickSort(b, 0, size - 1);
	end = clock();
	cout << "quickSort:" << end - start << " ms" << endl;

	return 0;

}

总体来说,快速排序高效很多,注意,不要使用swap函数,特别是堆排序,可能是函数调用太多导致效率太低。

时间: 2024-07-29 09:13:02

排序大汇总的相关文章

排序算法大汇总

排序算法大汇总 排序算法是最基本最常用的算法,也是各大上市公司经常会被问道的面试知识点之一,不同的排序算法在不同的场景或应用中会有不同的表现,我们需要对各种排序算法熟练才能将它应用到实际应用中,才能更好的发挥他们的优势,那么今天我们来对各种算法进行一个简单的总结和分析. 冒泡排序 冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.所以,如果两个元素相等,我们不会无聊地把他们俩交换:如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相

排序算法汇总总结_Java实现

一.插入排序 直接插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 代码实现: public class Inseretion_Sort {     public static void main(Stri

Android app性能优化大汇总之内存性能优化

写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在Android开发中遇到关于内存问题,或者马上要参加面试,或者就是单纯的学习或复习一下内存相关知识,都欢迎阅读.(本文最后我会尽量列出所参考的文章). 内存简介: RAM(random access memory)随机存取存储器.说白了就是内存. 一般Java在内存分配时会涉及到以下区域: 寄存器(R

C语言面试题大汇总

C语言面试题大汇总 1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量.对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内. 2.如何引用一个已经定义过的全局变量? 答: extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引

排序算法汇总(C/C++实现)

前言:     本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的校级赛.区域赛.没什么惊天动地的奖项,最好的名次也就省三等奖.现在作为第一篇算法总结就拿常见的排序算法以我个人的理解,以及代码实现跟大家简单分享一下(排序算法如果一一罗列的话,不下十种.曾在图书馆的旧书架上看过一本近900页的书,内容就是专门介绍排序算法). 选择排序(select) 选择排序比较容

极简主义(Minimalist)Web 框架大汇总

极简主义(Minimalist)Web 框架大汇总 罗列了一系列极简主义的框架(简单.轻量级),按编程语言分好类,按字母顺序排序. 列表 CSS 框架 C 写的 Web 框架 PHP 写的 数据库 框架 前端 JS 的框架 Go 写的 Web 框架 Haskell 写的 Web 框架 Java 写的 Web 框架 JavaScript 写的 Web 框架 Lua 写的 Web 框架 Node.js 写的 Web 框架 Perl 写的 Web 框架 PHP 写的 Web 框架 Python 写的

ANDROID内存优化(大汇总——中)

本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在ANDROID开发中遇到关于内存问题,或者马上要参加面试,或者就是单纯的学习或复习一下内存相关知识,都欢迎阅读.(本文最后我会尽量列出所参考的文章). OOM: 内存泄露可以引发很多的问题: 1.程序卡顿,响应速度慢(内存占用高时JVM虚拟机会频繁触发GC) 2.莫名消失(当你的程序所占内存越大,它在后台的时候就

ANDROID内存优化以及原理(大汇总——上)

写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在ANDROID开发中遇到关于内存问题,或者马上要参加面试,或者就是单纯的学习或复习一下内存相关知识,都欢迎阅读.(本文最后我会尽量列出所参考的文章). 内存简介: RAM(random access memory)随机存取存储器.说白了就是内存. 一般Java在内存分配时会涉及到以下区域: 寄存器(R

java面试大汇总

java面试笔试题大汇总     第一,谈谈final, finally, finalize的区别. 最常被问到. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统). 第四,&和&&的区别. 这个问得很少. 第五,HashMap和Hashtable的区