排序:基本排序算法合集

#include<iostream>
using namespace std;
/*直接插入排序*/
void DirectInsert(int r[],int n)
{
	for (int i = 2; i <= n; i++)
	{
		r[0] = r[i];
		int j = i - 1;
		while (r[0] < r[j])
		{
			r[j + 1] = r[j];
			j--;
		}
		r[j+1] = r[0];
	}
}
/*希尔排序*/
void ShellSort(int r[], int n)
{
	for(int d = n / 2; d>=1;d=d/2)
	for (int i = 1+d; i <= n; i++)
	{
		r[0] = r[i];
		int j = i - d;
		while (j>0&&r[0] < r[j])
		{
			r[j + d] = r[j];
			j=j-d;
		}
		r[j + d] = r[0];
	}
}
/*冒泡排序*/
void BubbleSort(int r[],int n)
{
	int exchange = n - 1;
	while (exchange)
	{
		int bound = exchange;
		exchange = 0;
		for(int j=0;j<bound;j++)
			if (r[j] > r[j + 1])
			{
				int temp;
				temp = r[j];
				r[j] = r[j + 1];
				r[j + 1] = temp;
				exchange = j;
			}
	}
}
/*快速排序*/
int Partition(int r[], int start,int end )
{
	int i = start;
	int j = end;
	while (i < j)
	{
		while (i < j && r[i] < r[j])
			j--;
		if (i < j)
		{
			int temp1;
			temp1 = r[i];
			r[i] = r[j];
			r[j] = temp1;
			i++;

		}
		while (i < j && r[i] < r[j])
			i++;
		if (i < j)
		{
			int temp2;
			temp2 = r[i];
			r[i] = r[j];
			r[j] = temp2;
			j--;

		}
	}
	return i;
}
void QuickSort(int r[], int start, int end)
{
	if (start < end)
	{
		int pos = Partition(r, start, end);
		QuickSort(r, start, pos - 1);
		QuickSort(r, pos + 1, end);
	}
}
/*堆排序*/
void Shift(int r[], int k, int end)
{
	int i = k; int j = 2 * i;
	while (j <=end)
	{
		if (j < end && r[j] < r[j + 1])
			j++;
		if (r[i] < r[j])
		{
			int temp;
			temp = r[i];
			r[i] = r[j];
			r[j] = temp;
		}
		i = j;
		j = 2 * i;
	}
}
void HeapSort(int r[], int n)
{
	for (int k = n / 2; k >= 1; k--)
		Shift(r, k, n);
	for (int k = 1; k < n; k++)
	{
		int temp;
		temp = r[1];
		r[1] = r[n - k + 1];
		r[n - k + 1] = temp;
		Shift(r, 1, n - k);
	}
}

/*归并排序*/
void Merge(int r[], int t[], int start, int mid, int end)
{
	int i = start; int j = mid + 1; int k = start;
	while (i <= mid&& j <= end)
	{
		if (r[i] <= r[j])
			t[k++] = r[i++];
		else
			t[k++] = r[j++];
			
	}
	while (i <= mid)
		t[k++] = r[i++];
	
	while (j <= end)
		t[k++] = r[j++];
		
}
void MergePass(int r[], int t[], int n, int h)
{
	int i = 1;
	while (i <= n - 2 * h+1)
	{
		Merge(r, t, i, i + h - 1, i + 2 * h - 1);
		i = i + 2 * h;
	}
	if (i < n - h+1)
		Merge(r, t, i, i + h - 1, n);
	else
	{
		for (int k = i; k <= n; k++)
			t[k] = r[k];
	}
}

void MergeSort(int r[], int t[], int n)
{
	int h = 1;
	while (h < n)
	{
		MergePass(r, t, n, h);
		h = 2 * h;
		MergePass(t, r, n, h);
		h = 2 * h;

	}
}

/*void MergeSort2(int r[], int t[], int start, int end)
{
	int mid;
	if (start == end)
		t[start]=r[start];
	else
	{
		mid=(start + end) / 2;
		MergeSort2(r, t, start, mid);
		MergeSort2(r, t, mid + 1, end);
		Merge(t, r, start, mid, end);


	}
}*///这里的递归算法有点问题
int main()
{
	int r[] = {-1,1,6,5,4,2,7,8,3};
	int t[9] = {0};
	MergeSort(r, t,8);
	for (int i = 1; i < 9; i++)
		cout << r[i];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来分别回答您的问题。 直接插入排序算法: 直接插入排序是一种简单的排序算法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。 算法步骤如下: 1. 将待排序的序列分成两个部分:已排序部分和未排序部分。 2. 取出未排序部分的第一个元素,将它插入到已排序部分的适位置,使得插入后仍然是有序的。 3. 重复上述步骤,直至未排序部分为空。 下面是直接插入排序的 Python 代码实现: ```python def insert_sort(lst): n = len(lst) for i in range(1, n): key = lst[i] j = i - 1 while j >= 0 and lst[j] > key: lst[j + 1] = lst[j] j -= 1 lst[j + 1] = key return lst ``` 冒泡排序算法: 冒泡排序是一种交换排序算法,它的基本思想是通过不断地交换相邻的元素,把小的元素向数组的一端移动,把大的元素向数组的另一端移动,从而达到排序的目的。 算法步骤如下: 1. 从数组的第一个元素开始,依次比较相邻的两个元素的大小。 2. 如果它们的顺序不正确,就交换它们的位置,使得较小的元素被移到数组的前面。 3. 重复上述步骤,直至整个数组都被排序。 下面是冒泡排序的 Python 代码实现: ```python def bubble_sort(lst): n = len(lst) for i in range(n): for j in range(n - i - 1): if lst[j] > lst[j + 1]: lst[j], lst[j + 1] = lst[j + 1], lst[j] return lst ``` 希望我的回答能够帮到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值