面试题---各种排序。插入,选择,冒泡,shell,堆,快排

#include<iostream>
#include<string>
#include<vector>

using namespace std;
void swap(int a[], int i, int j);

void insert_sort(int a[], int n)
{
	for (int i = 1; i < n; i++)
	{
		int temp = a[i], j = i;
		while (j&&temp < a[j - 1])
		{
			a[j] = a[j - 1];
			j--;
		}
		a[j] = temp;
	}
}

void shell_sort(int a[], int n)
{
	for (int inc = n / 2; inc; inc /= 2)
	{
		for (int i = inc; i < n; i++)
		{
			int temp = a[i],j=i;
			while (j>=inc&&temp < a[j - inc])
			{
				a[j] = a[j - inc];
				j -= inc;
			}
			a[j] = temp;
		}
	}
}

void select_sort(int a[], int n)
{
	for (int i = 0; i < n; i++)
	{
		int index = i;
		int temp = a[i];
		for (int j = i+1; j < n; j++)
		{
			if (a[j] < a[index])
			{
				index = j;
			}
		}
		a[i] = a[index];
		a[index] = temp;
	}
}

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

void merge(int a[], int l, int m, int r)
{
	int *temp = new int[r - l];
	int i = 0, j = l, k = m;
	while (j < m&&k < r)
	{
		if (a[j] < a[k])
		{
			temp[i++] = a[j++];
		}
		else
		{
			temp[i++] = a[k++];
		}
	}
	while (j != m)
	{
		temp[i++] = a[j++];
	}
	while (k != r)
	{
		temp[i++] = a[k++];
	}

	for (int i = l; i < r; i++)
	{
		a[i] = temp[i - l];
	}
	delete[] temp;
	temp = nullptr;
}

void merge_sort(int a[], int l, int r)
{
	if (l + 1 >= r)
	{
		return;
	}
	int middle = (l + r) / 2;
	merge_sort(a, l, middle);
	merge_sort(a, middle, r);
	merge(a, l, middle, r);
}

void quick_sort(int a[], int l, int r)
{
	if (l + 1 >= r)
	{
		return;
	}
	int pivot = a[l];
	int i = l, j = r;
	while (true)
	{
		do
		{
			i++;
		} while (a[i] < pivot&&i<r);
		do
		{
			j--;
		} while (a[j] >= pivot&&j > l);
		if (i >= j)break;
		swap(a, i, j);
	}
	a[l] = a[j];
	a[j] = pivot;
	quick_sort(a, l, j);
	quick_sort(a, j + 1, r);
}

void shut_down(int a[], int hole,int n)
{
	while (hole < n)
	{
		int firstIndex = hole * 2 + 1;
		if (firstIndex + 1 < n&&a[firstIndex] < a[firstIndex + 1])
		{
			firstIndex++;
		}
		if (firstIndex < n&&a[hole] < a[firstIndex])
		{
			swap(a, hole, firstIndex);
		}
		hole = firstIndex;
	}
}

void make_heap(int a[], int n)
{
	for (int i = (n-1) / 2; i>=0; i--)
	{
		shut_down(a, i, n);
	}
}
void heap_sort(int a[], int n)
{
	make_heap(a, n);
	for (int i = n - 1; i; i--)
	{
		swap(a, 0, i);
		make_heap(a, i);
	}
}
void swap(int a[], int i, int j)
{
	int temp = a[i];
	a[i] = a[j];
	a[j] = temp;
}
void print(int a[], int n)
{
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
}

/*
int main()
{
	int* a = new int[10];
	for (int i = 0; i < 10; i++)
	{
		a[i] = rand() % 10;
	}
	print(a, 10);
	//insert_sort(a, 10);
	//shell_sort(a, 10);
	//select_sort(a, 10);
	//bubble_sort(a, 10);
	//merge_sort(a,0, 10);
	//quick_sort(a, 0, 10);
	//heap_sort(a, 10);
	//print(a, 10);
}
*/

  

时间: 2024-08-10 05:05:45

面试题---各种排序。插入,选择,冒泡,shell,堆,快排的相关文章

排序(一)归并、快排、优先队列等

排序(一) 初级排序算法 选择排序 思想:首先,找到数组中最小的那个元素.其次,将它和数组的第一个元素交换位置.再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置.如此往复,直到将整个数组排序. [图例] 图中,x轴方向为数组的索引,y轴方向为待排序元素的值. 选择排序有两个很鲜明的特点: 运行时间和输入无关.为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么信息.这种性质在某些情况下是缺点.(无论数组的初始状态是什么,此算法效率都一样低效) 数据移动是最少的.每次交换都

常见经典排序算法学习总结,附算法原理及实现代码(插入、shell、冒泡、选择、归并、快排等)

博主在学习过程中深感基础的重要,经典排序算法是数据结构与算法学习过程中重要的一环,这里对笔试面试最常涉及到的7种排序算法(包括插入排序.希尔排序.选择排序.冒泡排序.快速排序.堆排序.归并排序)进行了详解.每一种算法都有基本介绍.算法原理分析.算法代码. 转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/47280135 插入排序 1)算法简介 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过

排序算法的实现(归并,快排,堆排,希尔排序 O(N*log(N)))

今天跟着左老师的视频,理解了四种复杂度为 O(N*log(N))的排序算法,以前也理解过过程,今天根据实际的代码,感觉基本的算法还是很简单的,只是自己写的时候可能一些边界条件,循环控制条件把握不好. //对于一个int数组,请编写一个选择冒泡算法,对数组元素排序. //给定一个int数组A及数组的大小n,请返回排序后的数组. //测试样例: //[1, 2, 3, 5, 2, 3], 6 //[1, 2, 2, 3, 3, 5] #include <iostream> using namesp

排序详解(希尔,快排,归并等)

今天集中把几种排序的方法列一下,当然最出名的希尔,快排,归并和其优化当然也是满载 说到希尔排序的话,不得不先提到的就是插入排序了,希尔排序就是对直接插入排序的一种优化,下面就是直接插入排序的思想 1 void InsertSort(int *a, size_t size) 2 { 3 assert(a); 4 for (int i = 1; i < size; ++i) 5 { 6 int index = i; 7 int tmp = a[index]; 8 int end = index -

【技术宅2】插入选择冒泡快速交换排序算法

//插入排序(一维数组) //插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止. function insert_sort($arr){ $count=count($arr); for($i=1;$i<$count;$i++){ $tem=$arr[$i];// 获得当前值 $j=$i-1;// 获得当前值的前一个位置 while($arr[$j]>$tem){// 如果当前值小于前一

数字在排序数组中出现的次数(剑指offer)利用快排思想(O(logn))

数字在排序数组中出现的次数 参与人数:1216时间限制:1秒空间限制:32768K 通过比例:28.43% 最佳记录:0 ms|0K(来自 ) 题目描述 统计一个数字在排序数组中出现的次数. 题意:首先数组是个已经排列的有序递增序列!统计一个数出现的次数,相当于在有序的序列里插入一个数,那么我只要确定插入的位置,利用快排的思想,也可以说是二分,如果在数组中找到k,那么左右拓展边界就可以确定,该数在数组中出现的次数了. 一些特殊情况可以特判!比如k小于数组最小数,或者大于数组最大数: class

算法导论学习之快排+各种排序算法时间复杂度总结

快排是一种最常用的排序算法,因为其平均的时间复杂度是nlgn,并且其中的常数因子比较小. 一.快速排序 快排和合并排序一样都是基于分治的排序算法;快排的分治如下: 分解:对区间A[p,r]进行分解,返回q,使得A[p–q-1]都不大于A[q] A[q+1,r]都大于A[q]; 求解:对上面得到的区间继续递归进行快排 合并:因为快排是原地排序,所以不需要特别的合并 从上可以看出最重要的就是分解函数,其按关键值将数组划分成3部分,其具体实现的过程见代码注释. 我们一般取数组的最后一个元素作为划分比较

算法总结——三大排序(快排,计数排序,归并)

快排: 适用条件:方便...只要数字不是很多 复杂度:O(nlogn)  每一层n复杂度,共logn层 原理:利用一个随机数与最后面一个数交换,那么这个随机数就到了最后一位,然后循环,如果前面的数大于最后一个数,那么把这个数放到前面去,经过一次排序之后,前面的数都是大于最后一个的,然后对1到k和k+1到n进行排序,一层一层地下去 模板: #include<cstdio> #include<algorithm> #include<time.h> using namespa

常见排序算法(冒泡、选择、插入、快速、归并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] <

php 常用四种排序 冒泡,选择,插入,快排

---恢复内容开始--- 1冒泡排序.  [为描述方便,例子全面为升序排列] 简述:假设数组有10个数字,从左向右.依次比较,如果前者大于后者,则两两交换.每一轮将冒泡一个最大数出来,依次循环,完成排序 流程描述:-- 第一次  a[0] 与 a[1]  比如果 a[0] > a[1]  则 a[0] 与 a[1] 交换,然后 a[1] 与 a[2] 交换,依次到  a[8] 与 a[9]  交换.  此轮过后  a[9] 必为  a[0-9]  中的最大值. 第二次(此时 a[9]以是最大值)