数据结构 (排序)

直接插入排序,冒泡排序,快速排序,选择排序,归并排序,堆排序

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<ctime>
#include<stdlib.h> 
using namespace std;



// 插入排序 
void InsertSort(int a[], int n)
{
	int temp;
	for(int i = 0; i < n; i++)
	{
		temp = a[i];
		int j = i-1;
		while(j && temp < a[j])
		{
			a[j+1] = a[j];
			j --;
		}
		a[j+1] = temp;
	}
}

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

// 快速排序 
void QuickSort(int a[], int l, int r)
{
	int i = l, j = r;
	if(l < r)
	{
		int temp = a[l];
		while(i < j)
		{
			while(j > i && a[j] >= temp)
				j --;
			if(i < j)
			{
				a[i] = a[j];
				i ++;
			}
			while(i < j && a[i] <= temp)
				i++;
			if(i < j)
			{
				a[j] = a[i];
				j --;
			 } 
		} 
		a[i] = temp;
		QuickSort(a, l, i-1);
		QuickSort(a, i+1, r);
	}
}

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

// 归并排序 
void mergearray(int a[], int first, int mid, int last, int temp[])
{
	int i = first;
	int j = mid + 1;
	int n = mid;
	int m = last;
	int k = 0;
	while(i <= n && j <= m)
	{
		if(a[i] < a[j])
			temp[k ++] = a[i ++];
		else
			temp[k ++] = a[j ++];
	}
	while(i <= n)
		temp[k ++] = a[i ++];
	while(j <= m)
		temp[k ++] = a[j ++];
	for(int i = 0; i < k; i++)
		a[first + i] = temp[i];	 	
}

void  mergesort(int a[], int first, int last, int temp[])
{
	if(first < last)
	{
		int mid = (first + last) / 2;
		mergesort(a, first, mid, temp);
		mergesort(a, mid + 1, last, temp);
		mergearray(a, first, mid, last, temp);
	}
}

// 堆排序 序号从1开始 
void Sift(int a[], int l, int r)
{
	int i = l, j = 2*i;
	int temp = a[i];
	while(j <= r)
	{
		if(j < r && a[j] < a[j+1])
			j++;
		if(temp < a[j]) // 父节点小于子节点, 则交换值,并指向子节点 
		{
			a[i] = a[j];
			i = j;
			j = 2*i;
		}
		else
			break; 
	}
	a[i] = temp; // 该节点最终的位置 
}

void HeapSort(int a[], int n)
{
	int temp;
	for(int i = n/2; i >= 1; i--) // 初始化堆 
		Sift(a, i, n);
	for(int i = n; i >= 2; i--)
	{
		temp = a[1];  // 最右节点,交换根节点(根节点为最值) 
		a[1] = a[i];
		a[i] = temp;
		Sift(a, 1, i-1); // 减少一个 
	} 
}
 
int main()
{
	int a[5], b[5];
	for(int i = 1; i <= 4; i++)
		b[i] = rand()%10;
	HeapSort(b, 4);
	cout << "堆排序 : " << endl; 
	for(int i = 1; i <= 4; i++)
		printf("%d%c", b[i], i==4?'\n':' ');
	
	cout << "快速排序 :"<< endl;	
	QuickSort(a, 0, 4);
	for(int i = 0; i < 5; i++)
		printf("%d%c", a[i], i==4?'\n':' ');
	for(int i = 0; i < 5; i++)
		a[i] = rand()%10;	
	cout << "直接插入排序 :"<< endl;	
	QuickSort(a, 0, 4);
	for(int i = 0; i < 5; i++)
		printf("%d%c", a[i], i==4?'\n':' ');
	for(int i = 0; i < 5; i++)
		a[i] = rand()%10;
	cout << "冒泡排序 :"<< endl;	
	QuickSort(a, 0, 4);
	for(int i = 0; i < 5; i++)
		printf("%d%c", a[i], i==4?'\n':' ');
	for(int i = 0; i < 5; i++)
		a[i] = rand()%10;
	cout << "选择排序排序 :"<< endl;	
	QuickSort(a, 0, 4);
	for(int i = 0; i < 5; i++)
		printf("%d%c", a[i], i==4?'\n':' ');
	for(int i = 0; i < 5; i++)
		a[i] = rand()%10;
	cout << "归并排序 :"<< endl;	
	QuickSort(a, 0, 4);
	for(int i = 0; i < 5; i++)
		printf("%d%c", a[i], i==4?'\n':' ');
	return 0; 
 } 

猜你喜欢

转载自blog.csdn.net/qq_38295645/article/details/90083001