考研数据结构——排序,算法代码部分

#include<iostream>
using namespace std;
int main()
{
	return 0;
}

//直接插入排序
void insertSort(int arr[], int n)
{
	int temp, i, j;
	for (i = 0; i < n; i++)
	{
		temp = arr[i];

		j = i - 1;
		while (j>=0&&temp<arr[j])
		{
			arr[j + 1] = arr[j];
			--j;
		}
		arr[j + 1] = temp;
	}
}

//简单选择排序
void selectSort(int arr[], int n)
{
	int i, j, k;
	int temp;
	for ( i = 0; i < n; i++)
	{
		k = i;
		for (j = i + 1; j < n;++j)
		if (arr[k]>arr[j])
			k = j;
		temp = arr[i];
		arr[i] = arr[k];
		arr[k] = temp;
	}
}

//冒泡排序
void bubleSort(int arr[], int n)
{
	int i, j, flag;
	int temp;
	for ( i = n-1; i >=1; --i)
	{
		flag = 0;
		for ( j = 1; j <= i; j++)
		{
			if (arr[j-1]>arr[j])
			{
				temp = arr[j];
				arr[j] = arr[j - 1];
				arr[j - 1] = temp;

				flag = 1;
			}
		}
		if (flag = 0)
			return;
	}
}

//希尔排序
void shellSort(int arr[], int n)
{
	int temp;
	//设置不断减半的增量
	for (int gap = n/2; gap >0; gap/=2)
	{
		//i的作用是选出无序序列的一个关键字并将其插入到有序序列中
		for (int i = gap; i < n; ++i)
		{
			temp = arr[i];
			int j;
			for (j = i; j >= gap && arr[j - gap]>temp; j -= gap)
				arr[j] = arr[j - gap];
			arr[j] = temp;
		}
	}
	//最后gap = 1时,就成为了直接插入排序
}

//快速排序
void quicksort(int arr[], int low, int high)
{
	int temp;
	int i = low, j = high;
	if (low<high)
	{
		temp = arr[low];
		while (i<j)
		{
			while (j>i&&arr[j] >= temp) --j;
			if (i < j)
			{
				arr[i] = arr[j];
				++i;
			}
			while (i < j&&arr[i] < temp) ++i;
			if (i<j)
			{
				arr[j] = arr[i];
				--j;
			}
		}
		arr[i] = temp;
		quicksort(arr, low, i - 1);
		quicksort(arr, i + 1, high);
	}
}

//堆排序实现代码

//调整顺序函数
void sift(int arr[], int low, int high)
{
	int i = low, j = 2 * i + 1;
	int temp = arr[i];
	while (j <= high)
	{
		if (j < high && arr[j] < arr[j + 1])
			++j;
		if (temp < arr[j])
		{
			arr[i] = arr[j];
			i = j;
			j = 2 * i + 1;
		}
		else
			break;
	}
	arr[i] = temp;
}

//建堆函数
void heapSort(int arr[], int n)
{
	int i;
	int temp;
	for (i = n / 2 - 1; i >= 0; --i)
		sift(arr, i, n - 1);
	for (i = n - 1; i > 0; --i)
	{
		temp = arr[0];
		arr[0] = arr[i];
		arr[i] = temp;
		sift(arr, 0, i - 1);
	}
}

//归并排序
//主函数
void mergeSort(int arr[], int low, int high)
{
	if (low < high)
	{
		int mid = (low + high) / 2;
		mergeSort(arr, low, mid);
		mergeSort(arr, mid + 1, high);
		merge(arr, low, mid, high);
	}
}
//排序函数
void merge(int arr[], int low, int mid, int high)
{
	int i, j, k;
	int n1 = mid - low + i;
	int n2 = high - mid;
	//VS编译器要求表达式必须具有常量值,先用数字代替
	//int L[n1], R[n2]; 
	int L[50], R[50];
	for (i = 0; i < n1; i++)
		L[i] = arr[low + i];
	for (j = 0; j < n2; j++)
		R[j] = arr[mid + 1 + j];

	i = 0;
	j = 0;
	k = low;
	while (i<n1 && j<n2)
	{
		if (L[i] <= R[j])
			arr[k] = L[i++];
		else
			arr[k] = R[j++];
		k++;
	}
	while (i < n1)
		arr[k++] = L[i++];
	while (j < n2)
		arr[k++] = R[j++];
}

猜你喜欢

转载自blog.csdn.net/gangangan0001/article/details/83956323