各类排序算法

1.快速排序

.快速排序(对冒泡排序的改进)
设要排序的数组是A[0],...,A[N-1],首先任意选取一个数据(通常选用第一个数)作为关键数据;然后把所有比它小的数都放到它前面,所有比它大的数都放在它后面,这样实现了一趟快速排序。
算法步骤:
1) 设置两个变量i,j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3) 从j开始向前搜索(j=j-1),找到第一个比key小的值A[j],并与A[i]交换;
4)从i开始向后搜索(i=i+1),找到第一个比key大的值A[i],并与A[j]交换;
5)重复3,4,5,直到i=j


#include "stdafx.h"
//快速排序
int Partition(int data[], int start, int end)
{
 int X= data[start]; //把第一个元素作为支点
 
 while(start < end)
 {
  //从后向前
  while(start<end && data[end]>=X) end--;
  data[start] = data[end];
  //从前向后
  while(start<end && data[start]<=X) start++;
  data[end] = data[start];
  data[start] = X;
 }
 return start;
}
void QuickSort(int data[], int start, int end)
{
 if(start == end)
  return;
 int index = Partition(data,start,end);
 if(index >start)
  QuickSort(data, start, index-1);
 if(index < end)
  QuickSort(data, index+1, end);
}
void print(int data[], int length)
{
 for(int i = 0; i < length; i++)
  printf("%d ", data[i]);
 printf("\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
 int data[]={72,6,57,88,60,42,83,73,48,85};
 print(data,sizeof(data)/sizeof(int));
 QuickSort(data,0,sizeof(data)/sizeof(int)-1);
 print(data,sizeof(data)/sizeof(int));
 return 0;
}

2.归并排序

#include "stdafx.h"

void merge_sort(int* A, int x, int y, int* T)
{
	if(y-x > 1)
	{
		int m = x + (y-x) /2;   //划分
		int p = x, q = m, i = x;
		merge_sort(A, x, m, T);  //递归
		merge_sort(A, m, y, T);

		while(p < m || q < y)
		{
			if(q >= y || (p < m && A[p] <= A[q])) T[i++] = A[p++];
			else T[i++] = A[q++];
		}
		for(i = x; i < y; i++) A[i] = T[i];
	}
}

//归并排序2(P284)
//归并操作
void Merge1(int SR[], int TR[], int i, int m, int n) {
	//将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]
	int j,k;
	for(j = m + 1, k = i; i <= m && j <=n; ++k)
		if(SR[i] < SR[j])
			TR[k] = SR[i++];
		else
			TR[k] = SR[j++];
	
		while(i<=m)
			TR[k] = SR[i++];
		while(j<=n)
			TR[k] = SR[j++];		
}

void Merge2(int SR[], int TR[], int i, int m, int n) {
	//将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]
	int j,k=n,s;
	for(s=m,j=n; s >=i && j>=m+1;k--)
		if(SR[i] < SR[j]) 
			TR[k] = SR[j--];
		else
			TR[k] = SR[s--];	

	while(j>= m+1)
		TR[k--] = SR[j--];
	while(s>=i)
		TR[k--] = SR[s--];

}

void MSort(int SR[], int TR1[], int s, int t)
{
	int m;
	int TR2[100];  
	if(s == t)
	{
		TR1[s] = SR[s];
		return;
	}

	m = (s+t)/2;              //将SR[s..t]平分为SR[s..m]和SR[m+1,..t]
	MSort(SR, TR2,s,m);       //递归地将SR[s..m]归并为有序的TR2[s..m]
	MSort(SR, TR2,m+1,t);     //递归地将SR[m+1..t]归并为有序的TR2[m+1,t]
	Merge2(TR2,TR1,s,m,t);    //将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t]

	return;
}

int A[] = { 1,0,2,3,9,7};
int n = sizeof(A)/sizeof(int);
int T[100];

void Test1()
{
	merge_sort(A,0,6,T);
	for(int i = 0; i < n; i++)
		printf("%d ", A[i]);
	printf("\n");
}

void Test2()
{
	int SR[] = {38,49,65,97,13,27,76}; //[0,3][4,6]
	int TR[100];
	Merge2(SR, TR, 0, 3,6) ;
	for(int i=0; i <7; i++)
		printf("%d ", TR[i]);
	printf("\n");
}
//归并排序
void Test3()
{
	int SR[] = {49, 38, 65, 97, 96, 13, 27};
	int TR[100];
	MSort(SR,TR,0,6);
	for(int i=0; i <7; i++)
		printf("%d ", TR[i]);
	printf("\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
	//Test2();
	Test3();
	return 0;
}

3.冒泡排序

//冒泡排序

#include "stdafx.h"

void bubble_sort(int a[], int n)
{
	bool change;
	for(int i = n -1, change = true; i >= 1 && change; --i) 
	{
		change = false;
		for(int j = 0; j < i; ++j)
			if(a[j] > a[j+1])
			{
				int tmp;
				tmp =a[j];
				a[j] = a[j+1];
				a[j+1] = tmp;
				change = true;
			}
	}
}

void print(int a[],int n)
{
	for(int i=0; i < n; i++)
		printf("%d ", a[i]);
	printf("\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
	int a[] = {4,5,3,2};
	print(a,4);
	bubble_sort(a, 4);
	print(a,4);

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值