C语言-内部排序算法





#include <stdio.h>
//直接插入排序
void InsertSort(int a[], int n)
{
	int i, j;
	int temp;
	for(i = 1; i <= n-1; ++i)
	{
		temp = a[i];
		for(j = i-1; j >= 0 && a[j] > temp; --j)
		{
			a[j+1] = a[j];
		}
		a[j+1] = temp;
	}
}
//折半插入排序
void BinaryInsertSort(int a[], int n)
{
	int i, j, low, heigh, mid;
	int temp;
	for(i = 1; i <= n-1; ++i)
	{
		temp = a[i];
		low = 0; 
		heigh = i-1;
		while(low <= heigh)
		{
			mid = (low + heigh) / 2;
			if(a[mid] > temp)
			{
				heigh = mid - 1;
			}
			else
			{
				low = mid + 1;
			}
		}
		for(j = i-1; j >= heigh+1; --j)
		{
			a[j+1] = a[j];
		}
		a[heigh + 1] = temp;
	}
}
//希尔排序
void ShellSort(int a[], int n)
{
	int i, j, dk;
	int temp;
	for(dk = n/2; dk > 0; dk /= 2)
	{
		for(i = dk; i <= n-1; ++i)
		{
			temp = a[i];
			for(j = i-dk; j >= 0 && a[j] > temp; j -= dk)
			{
				a[j+dk] = a[j];	
			}
			a[j+dk] = temp;
		}
	}
}
//冒泡排序
void BubbleSort(int a[], int n)
{
	int i, j;
	int temp;
	for(i = 1; i <= n-1; ++i)
	{
		bool flag = false;
		for(j = 0; j <= n-1-i; ++j)
		{
			if(a[j] > a[j+1])
			{
				flag = true;
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
		}
		if(flag == false)
			return;
	}
}
//快速排序
int Partition(int a[], int low, int heigh)
{
	int posTemp = a[low];
	while(low < heigh)
	{
		while(low < heigh && a[heigh] >= posTemp)
		{
			--heigh;
		}
		a[low] = a[heigh];
		while(low < heigh && a[low] <= posTemp)
		{
			++low;
		}
		a[heigh] = a[low];
	}
	a[low] = posTemp;
	return low;
}
void QuickSort(int a[], int low, int heigh)
{
	if(low < heigh)
	{
		int Pos = Partition(a,low,heigh);
		QuickSort(a,low,Pos-1);
		QuickSort(a,Pos+1,heigh);
	}
}
//简单选择排序
void SelectSort(int a[], int n)
{
	int i, j, temp;
	for(i = 0; i < n-1; ++i)
	{
		int pos = i;
		for(j = i+1; j < n; ++j)
		{
			if(a[j] < a[pos])
			{
				pos = j;
			}	
		}
		if(pos != i)
		{
			temp = a[i];
			a[i] = a[pos];
			a[pos] = temp;
		}
	}
}
//堆排序
void AdjustDown(int a[], int i, int n)
{
	int largest;
	int temp = a[i];
	for(largest = 2*i+1; largest < n; largest = 2*largest+1)
	{
		if(largest != n-1 && a[largest+1] > a[largest])
		{
			largest++;
		}
		if(temp < a[largest])
		{
			a[i] = a[largest];
			i = largest;
		}
		else
		{
			break;
		}
	}
	a[i] = temp;
}
void BuildMaxHeap(int a[], int n)
{
	for(int i = n/2-1; i >= 0; --i)
	{
		AdjustDown(a,i,n);
	}
}
void HeapSort(int a[], int n)
{
	int i, temp;
	BuildMaxHeap(a,n);
	for(i = n-1; i > 0; --i)
	{
		temp = a[0];
		a[0] = a[i];
		a[i] = temp;
		AdjustDown(a,0,i);
	}
}
//二路归并排序
int* b = new int[20];
void Merge(int a[], int low, int heigh, int mid)
{
	int i, j, k;
	for(k = low; k <= heigh; ++k)
	{
		b[k] = a[k];
	}
	for(i = low,j = mid+1,k = i; i <= mid && j <= heigh; ++k)
	{
		if(b[i] <= b[j])
		{
			a[k] = b[i++];
		}
		else
		{
			a[k] = b[j++];
		}
	}
	while(i <= mid)
	{
		a[k++] = b[i++];
	}
	while(j <= heigh)
	{
		a[k++] = b[j++];
	}
}
void MergeSort(int a[], int low, int heigh)
{
	if(low < heigh)
	{
		int mid = (low + heigh) / 2;
		MergeSort(a,low,mid);
		MergeSort(a,mid+1,heigh);
		Merge(a,low,heigh,mid);
	}
}
//打印输出
void Print(int a[], int n)
{
	for(int i=0; i<n; ++i)
    {
        printf("%d ",a[i]);
    }
	printf("\n");
}
int main(int argc, char* argv[])
{
    int arr[] = {98,76,109,34,67,190,80,12,14,89,1};
    int len = sizeof(arr)/sizeof(arr[0]);
    
	//排序前打印输出
	Print(arr,len);

	//插入类排序
	InsertSort(arr,len);
	//BinaryInsertSort(arr,len);
	//ShellSort(arr,len);

	//交换类排序
	//BubbleSort(arr,len);
	//QuickSort(arr,0,len-1);

	//选择类排序
	//SelectSort(arr,len);
	//HeapSort(arr,len);

	//二路归并排序
	//MergeSort(arr,0,len-1);

	//排序后打印输出
	Print(arr,len);

	//system("pause");
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值