内部排序

几种内部排序的实现

void SelectSort(int *a,int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		int flag = -1;
		for (int j = i + 1; j < n; j++)
		{
			if (a[i] > a[j])
			{
				flag = j;
			}
		}
		if (flag != -1)
		{
			int temp = a[i];
			a[i] = a[flag];
			a[flag] = temp;
		}
	}
}
void InsertSort(int *a, int n)
{
	int j;
	for (int i = 1; i < n; i++)
	{
		int temp = a[i];
		for (j = i-1; j >= 0; j--)
		{

			if (temp<a[j])
			{
				a[j+1] = a[j];
			}
			else
			{
				break;
			}
		}
		a[j+1] = temp;
	}
}
void BubbleSort(int *a, int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 0; j < n - i-1; j++)
		{
			if (a[j]>a[j + 1])
			{
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}

		}
	}
}
void DoubleBubbleSort(int *a, int n)
{
	int t = 0;
	int s = n;
	while (t < n / 2&&s>n/2)
	{
		for (int i = t; i < s-1; i++)
		{
			if (a[i]>a[i + 1])
			{
				int temp = a[i];
				a[i] = a[i + 1];
				a[i + 1] = temp;
			}
		}
		s--;
		for (int j = s; j > t; j--)
		{
			if (a[j] < a[j - 1])
			{
				int temp = a[j];
				a[j] = a[j - 1];
				a[j - 1] = temp;
			}
		}
		t++;
	}
}
void Merge(int *a, int begin, int mid, int end)
{
	int n1 = 0;
	int n2 = 0;
	n1 = mid - begin + 1;
	n2 = end - mid;
	int *before = new int[n1];
	int *after = new int[n2];
	int i = 0;
	int j = 0;
	int k = begin;
	for (i = 0; i < n1; i++)
	{
		before[i] = a[k];
		k++;
	}
	for (j = 0; j < n2; j++)
	{
		after[j] = a[k];
		k++;
	}
	i = 0;
	j = 0;
	for (k = begin;i<n1&&j<n2; k++)
	{
		if (before[i]>after[j])
		{
             a[k] = after[j];
			 j++;
		}
		else
		{
			a[k] = before[i];
			i++;
		}
	}
	if (i < n1)
		while (i < n1)
		{
		a[k] = before[i];
		i++;
		k++;
		}
	else
		while (j < n2)
		{
		a[k] = after[j];
		j++;
		k++;
		}
}
void MergeSort(int *a, int begin, int end)
{
	if (begin < end)
	{
		int mid = (begin + end) / 2;
		MergeSort(a, begin, mid);
		MergeSort(a, mid + 1, end);
		Merge(a, begin, mid, end);
	}
}
void QuickSort(int *a, int left,int right)
{
	if (left > right)
		return;
	int x = a[left];
	int i = left;
	int j = right;
	while (i < j)
	{
		while (i<j&&a[j] > x)
			j--;
		if (i < j)
			a[i++] = a[j];
		while (i<j&&a[i] < x)
			i++;
		if (i < j)
			a[j--] = a[i];
	}
	a[i] = x;
	QuickSort(a,left,i-1);
	QuickSort(a,i+1, right);
}
void ShellSort(int *a, int n)
{
	for (int h = n / 2; h > 0; h /= 2)
	{
		for (int i = h; i < n; i++)
		{
			int temp = a[i];
			int j;
			for (j = i - h; j >= 0; j -= h)
			{
				if (a[j]>a[i])
					a[j + h] = a[j];
				else
					break;
			}
			a[j + h] = temp;
		}
	}
}
void Heapfy(int A[], int idx, int max)      //建立最大堆
{
	int left = idx * 2 + 1;
	int right = left + 1;

	int largest = idx;

	if (left<max&&A[left]>A[idx]){ largest = left; }

	if (right<max&&A[largest]<A[right]){ largest = right; }

	if (largest != idx)
	{
		int temp = A[largest];
		A[largest] = A[idx];
		A[idx] = temp;
		Heapfy(A, largest, max);

	}
}

void HeapSort(int A[], int ll)
{
	int len = ll;
	for (int i = len / 2 - 1; i >= 0; --i)
	{
		Heapfy(A, i, len);
	}
	for (int i = len - 1; i >= 1; --i)
	{
		int temp = A[0];
		A[0] = A[i];
		A[i] = temp;
		Heapfy(A, 0, i);
	}
}
int main()
{
	int a[] = { 3, 2, 5, 1, 3, 7, 6, 8 };
	int n = sizeof(a) / sizeof(a[0]);
	//DoubleBubbleSort(a, n);
	//MergeSort(a, 0, n-1);
	//QuickSort(a, 0, n - 1);
	//ShellSort(a, n);
	HeapSort(a, n);
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << '\t';
	}
	getchar();
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-28 21:14:41

内部排序的相关文章

数据结构6种内部排序算法的比较

1.需求分析 (1)输入数据的形式为:伪随机数产生程序产生,且每次输入数不少于100个,至少要用5组不同的输入数据 (2)输出的形式为:输出关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)的数据 (3)程序能达到的功能:对起泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序这6种常用的内部排序算法进行比较,比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动) (4)测试数据:正确输入为由伪随机数产生程序产生100个随机数,然后输出比较结果,错

10-11-基数排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 基数排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试数据下载  链接? 数据

几种内部排序-分类-复杂性-稳定性

1. 简述 本文主要说明一些常用的内部排序算法的分类.复杂性和稳定性.主要基于现在的理解和学习,详细准确的复杂度可以参见维基百科等比较权威的网站,对于一些算法的不同实现,复杂度也不同,这里给出的复杂度都是相对较好的算法的复杂度. 2. 分类    3. 复杂性和稳定性 冒泡排序:在已经有序的情况,取得O(N)的复杂度.    快速排序:每次递归都是N的复杂度,递归次数根据序列有关系,当已经有序的情况下,递归N次,时间复杂度为O(N*LogN)    插入排序:在已经有序的情况,取得O(N)的复杂

直接插入排序(内部排序)

1 package com.trfizeng.insertionsort; 2 3 /** 4 * 5 * @author trfizeng 内部排序 插入排序 --- 直接插入排序(Straight Insertion Sort) 6 * 7 */ 8 public class StraightInsertionSort { 9 public static int[] straightInsertionSort(int[] array) { 10 // 对传来的待排序数组进行合法验证 11 i

简单的选择排序(内部排序)

1 /** 2 * 3 */ 4 package com.trfizeng.selectionsort; 5 6 /** 7 * @author trfizeng 内部排序 选择排序—简单选择排序(Simple Selection Sort) 8 */ 9 public class SimpleSelectionSort { 10 11 /** 12 * 每次选择一个最小记录放在前面去 13 */ 14 public static int[] simpleSelectionSort(int[]

内部排序一

闲来无事,复习下数据结构的常用内部排序,利用下午的时间,随便写了选择.快速排序.内部排序的实现,虽然常用数据结构算法原理还是挺简单,可以完成写出来还是费了一些工夫.此处贴出代码,仅作自己的随手联系之用. public class Program { public static void main(String[] args) { // TODO Auto-generated method stub int[] array = CreateRandomArray(20); Display(arra

内部排序-第10章-《数据结构题集》习题解析-严蔚敏吴伟民版

//**留坑待填**// 一.基础知识题 10.1?以关键码序列(503,087,512,061,908,170,897,275,653,426)为例,手工执行以下排序算法,写出每一趟排序结束时的关键码状态: (1)直接插入排序:                            (2)希尔排序(增量d[1]=5): (3)快速排序:                                  (4)堆排序: (5)归并排序:                              

10-12-顺序表地址排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 顺序表地址排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceListType.c        相关测试数据下载  链

10-9-堆排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 堆排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceListType.c        相关测试数据下载  链接? 数

基于比较的内部排序总结

★ 基于“比较”操作的内部排序性能大PK 我们首先总结一下<排序结构专题1-4>中的十种方法的性能((N个关键字的待排序列)): 排序方法        平均时间   最坏时间    辅助存储空间   稳定性   直接插入排序 O(N^2)   O(N^2)    O(1)                √      折半插入排序 O(N^2) O(N^2)  O(1)      √ 希尔排序  O(N*logN) O(N*logN) O(1)        × 起泡排序        O(N