数据结构——各种排序算法

本文详细介绍了C++实现的各种排序算法,包括直接插入排序、折半插入排序、冒泡排序、快速排序、选择排序、堆排序及双向冒泡排序,帮助读者理解并掌握这些经典算法。

各种排序算法

#include<iostream>
#include<stdlib.h>
using namespace std;

typedef int ElemType;

//直接插入排序 
void InsertSort(ElemType A[], int n)
{
	int i, j;
	for(i = 2; i <= n; i++)		//依次从第二个元素开始插入到前面已排序的元素 
	{
		if(A[i] < A[i-1])
		{
			A[0] = A[i];
			for(j = i-1; A[0] < A[j]; j--)		//从后往前查找插入位置 
				A[j+1] = A[j];
			A[j+1] = A[0];					//复制到插入位置 
		}
		
	}
}


//折半插入排序 
void InsertBSort(ElemType A[], int n)
{
	int i, j, low, high, mid;
	for(i = 2; i < n; i++)
	{
		A[0] = A[i];
		low = 1; 
		high = i-1;
		while(low <= high)
		{
			mid = (low + high) / 2;
			if(A[0] < A[mid])
				mid = high-1;
			else
				low = mid+1;
		}
		for(j = i-1; j >= high+1; j--)
			A[j+1] = A[j];
		A[high+1] = A[0];
	}
}

//交换排序——冒泡排序 
void BubbleSort(ElemType A[], int n)
{
	int i, j, flag,temp;
	for(i = 0; i < n-1; i++)
	flag = false;		//表明本趟是否发生交换的标志 
	for(j = n-1; j > i; j--)	//从最后一个数开始 
	{
		if(A[j] < A[j-1])		//如果后面的数大于前面,则交换 
		{	
			temp = A[j];
			A[j] = A[j-1];
			A[j-1] = temp;
			flag = true;		//标志位为真 
		}
		if(flag == false)		//本趟遍历后没有发生交换,说明已有序 
			return;
	}
	
}

//交换排序——快速排序 
//一次划分
int Partition(ElemType A[], int low, int high)
{
	ElemType pivot = A[low];		//把当前表的第一给元素设为枢轴,对表进行划分 
	while(low < high)				//循环跳出条件 
	{
		while(low < high && A[high] >= pivot)
			--high;
		A[low] = A[high];			//将比数轴小的值移到左端 
		while(low < high && A[low] <= pivot)
			++low;
		A[high] = A[low];			//将比枢轴大的值移到右端 
	} 
	A[low] = pivot;					//枢轴元素最终位置 
	return low;						//返回枢轴元素最终位置 
}

//快速排序
int QuickSort(ElemType A[], int low, int high)
{
	if(low < high)
	{
		int pivotpos = Partition(A, low, high);
		QuickSort(A, low, pivotpos-1);
		QuickSort(A, pivotpos+1, high);
	}
}


//简单选择排序 
void SelectSort(ElemType A[], int n)
{
	int i, j, min, temp;
	for(i = 0; i < n-1; i++)
	{
		min = i;		//记录最小元素的位置 
		for(j = i+1; j < n; j++)
		{
			if(A[j] < A[i])
				min = j;
			if(min != i)
			{
				temp = A[min];
				A[min] = A[i];
				A[i] = A[min];
			}
			
		}
	}
}

//堆排序
//建立大根堆 
void AdjustDown(ElemType A[], int k, int len)
{
	int i;
	for(i = 2*k; i <= len; i*=2)
	{
		if(i < len && A[i] < A[i+1])
			i++;
		if(A[0] > A[i])
			break;
		else
		{
			A[k] = A[i];
			k = i;
		}
	}
	A[0] = A[k];	
}

void BuildMaxHeap(ElemType A[], int len)
{
	int i;
	for(int i = len/2; i > 0; i--)
		AdjustDown(A, i, len);
}

//双向冒泡排序
void DBubbleSort(ElemType A[], int n)
{
	int low = 0, high = n-1;
	bool flag = true;						//一趟冒泡排序元素是否交换的标志 
	while(low < high && flag)		//循环跳出条件 
	{
		flag = false;	 			//初始标志为false 
		for(int i = low; i < high; i++)		//从前往后起泡 
		{
			if(A[i] > A[i+1]){				//逆序 
				swap(A[i], A[i+1]);			//交换 
				flag = true;				//发生交换,标志置true 
			}
		}
		high--;								//上界-1 
		for(int j = high; j > low; j--)		//从后往前起泡 
		{
			if(A[j] < A[j-1])
			{
				swap(A[j], A[j-1]);
				flag = true;				
			}
		}
		low++;								//下界+1; 
	}
	
}


int main()
{
	
	return 0;
} 
数据结构中的排序算法是指一种将一串数据按照特定顺序(通常是升序或降序)排列的方法。常见的排序算法有多种,每种都有其特点和适用场景: 1. **冒泡排序**(Bubble Sort):简单直观,通过不断交换相邻元素使得较大值逐渐“浮”到数组顶部。效率较低,适用于小规模数据。 2. **选择排序**(Selection Sort):每次从未排序部分找出最小(大)元素,放到已排序部分的末尾。不稳定,对大规模数据效率不高。 3. **插入排序**(Insertion Sort):类似于打扑克牌,将每个元素逐个插入到已排序的部分的适当位置。效率随着数据有序程度提高而提升。 4. **快速排序**(Quick Sort):采用分治策略,选取一个基准元素,将序列分为两部分,一部分小于基准,另一部分大于基准,然后递归地对这两部分进行排序。平均性能好,是一种常用的高效排序法。 5. **归并排序**(Merge Sort):同样基于分治,将数组分成两个子数组,分别排序后再合并。稳定,但需要额外的空间存储。 6. **堆排序**(Heap Sort):利用堆这种数据结构特性,构建最大堆或最小堆进行排序。原地操作,效率较高。 7. **计数排序**(Counting Sort):针对非负整数,统计每个元素出现次数,再根据次数重构有序序列。时间复杂度低至线性,但只能处理整数范围有限的情况。 8. **基数排序**(Radix Sort):按位数从最低位到最高位进行排序,适合数字类型的整数排序
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值