排序算法总结

1.插入排序

2. shell排序

3. 简单选择排序

4. 堆排序

5. 冒泡排序

6. 快速排序

#include <iostream>
#include <algorithm>
using namespace std;

void print_a(int a[], int N)
{
	for (int i = 0; i < N; i++)
		cout << a[i] << " ";
	cout << endl;
}

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

void shell_sort(int a[], int N)
{
	int j = 0;
	for (int P = N / 2; P > 0; P /= 2)//定义增量序列
	{
		for (int i = P; i < N; i++)//插入排序 把 1 全部换成 P
		{
			int temp = a[i];

			for (j = i - P; j >= 0 && temp < a[j]; j-=P)
			{
				a[j + P] = a[j];
			}
			a[j + P] = temp;
		}
	}	
}

int ScanForMin(int a[], int first, int end)
{
	int min = first;
	for (int i = first + 1; i <= end; i++)
	{
		if (a[i] < a[min])
			min = i;
	}
	return min;
}

void simpleSelect_sort(int a[], int N)
{
	for (int i = 0; i < N; i++)
	{
		int min = ScanForMin(a, i, N - 1);//找到i到N-1最小值的下标
		swap(a[i], a[min]);//序列首元素和最小值进行交换
	}
}

struct HNode{
	int *data;
	int size;
	int capacity;
};

HNode* createHeap(int MaxSize)
{
	HNode *H = new HNode;
	H->data = new int[MaxSize + 1];
	H->size = 0;
	H->capacity = MaxSize;
	H->data[0] = 1000;

	return H;
}

bool insertHeap(HNode *H, int data)
{
	if (H->size == H->capacity)
	{
		cout << "Heap is Full!" << endl;
		return false;
	}

	int i = ++H->size;
	for (; H->data[i/2] < data; i /= 2)
	{
		H->data[i] = H->data[i / 2];
	}
	H->data[i] = data;
	return true;
}

int deleteMax(HNode *H)
{
	int Maxdata = H->data[1];

	int temp = H->data[H->size--];
	int parent = 1;
	int child;
	for (; parent * 2 <= H->size; parent = child)
	{
		child = parent * 2;
		if (child != H->size && (H->data[child] < H->data[child + 1]))
			child++;
		if (temp >= H->data[child])
			break;
		else
			H->data[parent] = H->data[child];
	}
	H->data[parent] = temp;

	return Maxdata;
}

void Heap_sort(int a[],int N)
{
	HNode *H = createHeap(N);
	for (int i = 0; i < N; i++)
		insertHeap(H, a[i]);

	for (int i = 0; i < N; i++)
		cout << H->data[i] << endl;

	for (int i = 0; i < N; i++)
	{
		a[i] = deleteMax(H);
	} 
}

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

int Median3(int a[], int left, int right)
{
	int center = (left + right) / 2;
	if (a[left] > a[center])
		swap(a[left], a[center]);
	if (a[left] > a[right])
		swap(a[left], a[right]);
	if (a[center] > a[right])
		swap(a[center], a[right]);
	/*排序结束后a[left]-a[center]-a[right]从小到大排序*/

	swap(a[center], a[right - 1]);/*将基准放到右边*/
	/*只需考虑left+1到right-2排序*/
	return a[right - 1];

}

void Quick_sort(int a[], int left, int right)
{
	if (left < right)
	{
		int pivot = Median3(a, left, right);/*得到基准*/

		int i = left;
		int j = right - 1;
		while (1)
		{
			while (a[++i] < pivot);
			while (a[--j]>pivot);
			if (i < j)
				swap(a[i], a[j]);
			else
				break;
		}

		swap(a[i], a[right - 1]);/*i是基准的正确位置,将基准放入*/
		/*对左右子集进行递归排序*/
		Quick_sort(a, left, i - 1);
		Quick_sort(a, i + 1, right);
	}

}

void main()
{
	int a[] = { 44,12,59,36,62 };

	Quick_sort(a, 0, 4);
	print_a(a, 5);

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值