数据结构-排序

1.选择排序

思想:选择排序是一种最为基本的排序方式,很简单,比如要将10个数字从小到大进行排序的话,可以按照如下步骤进行操作。首先记录第一个位置的数字,然后依次与后面的数字进行比较,如果比记录的数字小,则进行交换。然后记录第二个位置的数字继续上述操作,直至最后一个数为止。

代码如下:

#include <stdio.h>
#include <stdlib.h>

void SelectSort(int arry[],int nLength)
{
	int i,j;
	int temp = 0;
	if(arry == NULL || nLength < 0)
	{
		return ;
	}
	for(i = 0;i < nLength ;i++)
	{
		for(j = i+1;j < nLength ;j++)
		{
			if(arry[j] < arry[i])
			{
				temp = arry[i];
				arry[i] = arry[j];
				arry[j] = temp;
			}
		}
	}
}
int main()
{
	int arry[] = {5,874,5,12,87,9,62,4};
	int nLength = sizeof(arry)/sizeof(arry[0]);
	int i = 0;
	SelectSort(arry,nLength);
	for(i = 0;i < nLength;i++)
	{
		printf("%d ",arry[i]);
	}
	system("pause");
	return 0;
}

2.冒泡排序

思想:冒泡排序的思想也比比较简单。每次将相邻的两个数进行比较,判断后进行交换或者不变,就可以将数字顺序排好。比如 有10个数按照从小到大的顺序进行排序,可以按照如下方式进行排序。将第一个位置与第二个位置的数字进行比较,如果第一个位置的数字大于第二个位置的数字,则将这两个数字进行交换,否则不变。然后让第二个位置与第三个位置的数做如上操作,将所有数字数字比较一遍后。ni'h你会发现,最大的数字已经在末尾处。继续如上操作,将第二大的数放在倒数第二个位置,如此重复n-1遍,结束排序。

代码如下:

#include <stdio.h>
#include <stdlib.h>

void BubbleSort(int arry[],int nLength)
{
	int i,j;
	int nFlag = 0;
	if(arry == NULL || nLength < 0)
	{
		return ;
	}
	for(i = 0;i < nLength-1;i++)
	{
		nFlag = 0;
		for(j = 0;j < nLength - nFlag - 1;j++)
		{
			if(arry[j] > arry[j+1])
			{
				arry[j] = arry[j] + arry[j+1];
				arry[j+1] = arry[j] - arry[j+1];
				arry[j] = arry[j] - arry[j+1];
				nFlag = j+1;
			}

		}
		//如果排好序了,就不用继续遍历
		if(nFlag == 0)
		{
			break;
		}
		//后面的数排好序的越多 nFlag越小 i的值越大 需要遍历的次数越少
		i = nLength - nFlag - 1;
	}
}
int main()
{
	int arry[] = {5,874,5,12,87,9,62,4};
	int nLength = sizeof(arry)/sizeof(arry[0]);
	int i = 0;
	BubbleSort(arry,nLength);
	for(;i < nLength;i++)
	{
		printf("%d ",arry[i]);
	}
	system("pause");
	return 0;
}

3.插入排序

思想:插入排序是是先部分有序,然后从后面的数中依次与有序部分进行比较,比较完后插入有序表中,扩大有序部分直至所有 数字都变为有序状态。

代码如下:

#include <stdio.h>
#include <stdlib.h>

void InsertSort(int arry[],int nLength)
{
	int i,j;
	int nFlag = 0;
	if(arry == NULL || nLength < 0)
	{
		return ;
	}
	for(i = 1;i < nLength;i++)
	{
		nFlag = arry[i];
		//排好的数的末位位置
		j = i-1;
		while(j >= 0 && arry[j] > nFlag)
		{
			//向后移
			arry[j+1] = arry[j];
			j--;
		}
		//结束后j比所需要的下标小1
		arry[j+1] = nFlag;
	}

}
int main()
{
	int arry[] = {5,874,5,12,87,9,62,4};
	int nLength = sizeof(arry)/sizeof(arry[0]);
	int i = 0;
	InsertSort(arry,nLength);
	for(;i < nLength;i++)
	{
		printf("%d ",arry[i]);
	}
	system("pause");
	return 0;
}

4.快排

思想:选择1个数作为基准,然后将数字分类。比如数字{5,874,5,12,87,9,62,4},则可以以5为基准,将其分为{4,5},{874,5,12,87,9,62},两部分,再将各部分进行上述操作,直至无法在分割为止。

代码如下:

#include<stdio.h>
#include<stdlib.h>

void QuickSortUp(int arry[],int nPre,int nLast)
{
	int nSmall;
	int a,b;
	if(arry == NULL)
	{
		return ;
	}
	if(nPre >= nLast)
	{
		return;
	}
	nSmall = nPre - 1;
	a = nPre;
	b = nLast;
	//nLst作为标准 不变
	while(nPre != nLast)
	{
		//从nPre开始比较 如果小于标准
		if(arry[nPre] < arry[nLast])
		{
			//将nSmall加1
			nSmall++;
			//判断nSmall与nPre是否重合
			if(nSmall != nPre)
			{
				arry[nSmall] = arry[nPre] + arry[nSmall];
				arry[nPre] = arry[nSmall] - arry[nPre];
				arry[nSmall] = arry[nSmall] - arry[nPre];
			}
			nPre++;
		}else
		{
			//如果大于标准 只有nPre加1
			nPre++;
		}
	}
	nSmall++;
	if(nSmall != nLast)
	{
		arry[nSmall] = arry[nLast] + arry[nSmall];
		arry[nLast] = arry[nSmall] - arry[nLast];
		arry[nSmall] = arry[nSmall] - arry[nLast];
	}
	QuickSortUp(arry,a,nSmall - 1);
	QuickSortUp(arry,nSmall + 1,b);;
}
int main()
{
	int arry[] = {5,874,5,12,87,9,62,4};
	int nLength = sizeof(arry)/sizeof(arry[0]);
	int i = 0;
	QuickSortUp(arry,0,7);
	for(;i < nLength;i++)
	{
		printf("%d ",arry[i]);
	}
	system("pause");
	return 0;
}

5.堆排序

思想:堆排序是将数字构建成一颗二叉树,然后将调整这颗二叉树,比如大项堆就是将数字组成的堆进行调整,使得父节点都比 子节点的数大,注意是从从下往上调整的,且每次调整后倒要向下检查,看交换完当前值后是否还满足上述条件。每次取出时,将树的根元素与最后一个交换,弹出交换后的最后一个数字,然后重新调整堆。

代码如下:

#include <stdio.h>
#include <stdlib.h>

#define  nLeft nRoot*2+1
#define  nRight nRoot*2+2
void Change(int arry[],int nRoot,int nLength)
{
	if(arry == NULL)
	{
		return ;
	}
	while(1)
	{
		if(nRight < nLength)
		{
			if(arry[nRight] > arry[nLeft])
			{
				if(arry[nRight] > arry[nRoot])
				{
					arry[nRoot] = arry[nRoot] + arry[nRight];
					arry[nRight] = arry[nRoot] - arry[nRight];
					arry[nRoot] = arry[nRoot] - arry[nRight];
					nRoot = nRight;
					continue;
				}
				break;
			}else
			{
				if(arry[nLeft] > arry[nRoot])
				{
					arry[nRoot] = arry[nRoot] + arry[nLeft];
					arry[nLeft] = arry[nRoot] - arry[nLeft];
					arry[nRoot] = arry[nRoot] - arry[nLeft];
					nRoot = nLeft;
					continue;
				}
				break;
			}
		}
		if(nLeft < nLength)
		{
			if(arry[nLeft] > arry[nRoot])
			{
				arry[nRoot] = arry[nRoot] + arry[nLeft];
				arry[nLeft] = arry[nRoot] - arry[nLeft];
				arry[nRoot] = arry[nRoot] - arry[nLeft];
				nRoot = nLeft;
				continue;
			}else
			{
				break;
			}
		}
		break;
	}
}


void HeapSort(int arry[],int nLength)
{
	int i;
	if(arry == NULL || nLength <= 0)
	{
		return ;
	}

	for(i = nLength/2 - 1;i >= 0;i--)
	{
		Change(arry,i,nLength);
	}

	for(i = nLength - 1;i > 0;i--)
	{
		arry[i] = arry[i] + arry[0];
		arry[0] = arry[i] - arry[0];
		arry[i] = arry[i] - arry[0];
		Change(arry,0,i);
	}
}

int main()
{
	int arry[] = {5,874,5,12,87,9,62,4};
	int nLength = sizeof(arry)/sizeof(arry[0]);
	int i = 0;
	HeapSort(arry,nLength);
	for(;i < nLength;i++)
	{
		printf("%d ",arry[i]);
	}
	system("pause");
	return 0;
}

6.基数排序

思想:将所有数字按照个位数大小进行一遍排序,然后将其再按照十位数字排序,再按照百位数字排序,直至最大位为止。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
typedef struct MyStruct
{
	struct MyStruct * pNext;
	int nNum;
	int index;
}HashNode;
void LSD(int arry[],int nLength,int nNum)
{
	HashNode * pTemp = NULL;
	HashNode * * arr1 = NULL;
	HashNode * * arr2 = NULL;
	HashNode * p = NULL;
	HashNode * pj = NULL;
	HashNode * pDel = NULL;
	int nMax;
	int a,b,c;
	int i,j;
	if(arry == NULL)
	{
		return ;
	}
	nMax = arry[0];
	arr1 = (HashNode* *)malloc(sizeof(HashNode*)*(10));
	memset(arr1,0,sizeof(HashNode*)*(10));
	arr2 = (HashNode* *)malloc(sizeof(HashNode*)*(10));
	memset(arr2,0,sizeof(HashNode*)*(10));
	for(i = 1;i < nLength;i++)
	{
		if(arry[i] > nMax)
		{
			nMax = arry[i];
		}
	}

	for(i = 0;i < nLength;i++)
	{
		pTemp = (HashNode *)malloc(sizeof(HashNode));		
		pTemp->index = i;
		pTemp->pNext = NULL;
		pTemp->nNum = arry[i];
		b = arry[i]%10;
		if(arr1[arry[i]%10] == NULL)
		{
			arr1[arry[i]%10] = pTemp;
		}else
		{
			p = arr1[arry[i]%10];
			while(1)
			{
				if(p->pNext == NULL)
				{
					break;
				}
				p = p->pNext;
			}
			p->pNext = pTemp;
		}
	}
	j = 1;
	b = 1;
	while(nMax/(j * 10) != 0)
	{
		if(b%2 == 1)
		{
			for(a = 0;a < 10;a++)
			{
				pj = arr1[a];
				while(pj != NULL)
				{
					pTemp = (HashNode *)malloc(sizeof(HashNode));		
					pTemp->index = i;
					pTemp->pNext = NULL;
					pTemp->nNum = pj->nNum;
					c = pj->nNum/(10*j)%10;
					if(arr2[c] == NULL)
					{
						arr2[c] = pTemp;
					}else
					{
						p = arr2[c];
						while(1)
						{
							if(p->pNext == NULL)
							{
								break;
							}
							p = p->pNext;
						}
						p->pNext = pTemp;
					}
					pj = pj->pNext;
				}
			}
			for(a = 0;a < 10;a++)
			{
				p = arr1[a];
				while(p != NULL)
				{
					pDel = p->pNext;
					free(p);
					p = NULL;
					p = pDel;
				}
				arr1[a] = NULL;
			}
		}else
		{
			for(a = 0;a < 10;a++)
			{
				pj = arr2[a];
				while(pj != NULL)
				{
					pTemp = (HashNode *)malloc(sizeof(HashNode));		
					pTemp->index = i;
					pTemp->pNext = NULL;
					pTemp->nNum = pj->nNum;
					c = pj->nNum/(10*j)%10;
					if(arr1[c] == NULL)
					{
						arr1[c] = pTemp;
					}else
					{
						p = arr1[c];
						while(1)
						{
							if(p->pNext == NULL)
							{
								break;
							}
							p = p->pNext;
						}
						p->pNext = pTemp;
					}
					pj = pj->pNext;
				}
			}
			for(a = 0;a < 10;a++)
			{
				p = arr2[a];
				while(p != NULL)
				{
					pDel = p->pNext;
					free(p);
					p = NULL;
					p = pDel;
				}
				arr2[a] = NULL;
			}
		}
		j *= 10;
		b++;
	}
	i = 0;
	if(b%2 == 1)
	{
		for(a = 0;a < 10;a++)
		{
			p = arr1[a];
			while(p)
			{
				arry[i++] = p->nNum;
				p = p->pNext;
			}
		}
		for(a = 0;a < 10;a++)
		{
			p = arr1[a];
			while(p != NULL)
			{
				pDel = p->pNext;
				free(p);
				p = NULL;
				p = pDel;
			}
		}

	}else
	{
		for(a = 0;a < 10;a++)
		{
			p = arr2[a];
			while(p != NULL)
			{
				arry[i++] = p->nNum;
				p = p->pNext;
			}
		}
		for(a = 0;a < 10;a++)
		{
			p = arr2[a];
			while(p != NULL)
			{
				pDel = p->pNext;
				free(p);
				p = NULL;
				p = pDel;
			}
		}
	}
	
	return;
}
int main()
{
	int arry[] = {99,1,21,31,53,91,123,98,54,61,71,81,41,51,55,52};
	int nLength = sizeof(arry)/sizeof(arry[0]);
	int i = 0;
	LSD(arry,nLength,0);
	for(;i < nLength;i++)
	{
		printf("%d ",arry[i]);
	}
	system("pause");
	return 0;
}

7.希尔排序

思想:设置步长,将数组中相隔相同步长的设为一组进行排序,缩小步长,重复上述步骤,直至步长为1.

代码如下:

#include <stdio.h>
#include <stdlib.h>

void ShellSort1(int arr[],int nLength)
{
	int gap; //步长
	int i;//组
	int j;
	int temp;//保存当前值
	int k;

	if(arr == NULL || nLength <=0)return;

	//计算步长
	for(gap = nLength/2;gap >0;gap /=2)
	{
		//根据步长分组
		//每组内部进行插入排序
		for(j = gap;j<nLength;j++)
		{
			k = j-gap;
			temp = arr[j];

			while(temp < arr[k] && k>=0)
			{
				arr[k+gap] = arr[k];
				k-=gap;
			}
			arr[k+gap] = temp;
		}
	}
}
void ShellSort(int arry[],int nLength)
{
	int nGroup ;
	int nDex;
	int i;
	int nFlag;
	if(arry == NULL)
	{
		return ;
	}
	nDex = 0;
	nGroup = nLength;
	while(nGroup = nGroup/2 > 0 && nDex < nLength)
	{
		for(nDex = 1;nDex < nLength;nDex += nGroup)
		{
			nFlag = arry[nDex];
			//将排好的数的末位
			i = nDex-1;
			while(i >= 0 && arry[i] > nFlag)
			{
				//向后移
				arry[i+nGroup] = arry[i];
				i-=nGroup;
			}
			//结束后j比所需要的下标小1
			arry[i+1] = nFlag;
		}
	}
}
int main()
{
	int arry[] = {5,874,5,122,87,9,62,4};
	int nLength = sizeof(arry)/sizeof(arry[0]);
	int i = 0;
	ShellSort1(arry,nLength);
	for(;i < nLength;i++)
	{
		printf("%d ",arry[i]);
	}
	system("pause");
	return 0;

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值