冒泡排序:
#include<stdio.h>
void BubbleSort(int arr[],int nLength)
{
if(arr == NULL || nLength <= 0)return;
int i;
int j;
int nFlag = 0;
int nCount = 0;
for(i = 0;i<nLength;i++)
{
nFlag = 0;
for(j = 0;j<nLength-1-i;j++)
{
if(arr[j] > arr[j+1])
{
//交换
arr[j] = arr[j]^arr[j+1];
arr[j+1] = arr[j]^arr[j+1];
arr[j] = arr[j]^arr[j+1];
nFlag = j+1;
}
nCount++;
}
if(nFlag == 0)
{
break;
}
i = nLength-nFlag-1;
}
printf("%d\n",nCount);
}
int main()
{
int arr[] = {10,28,1,9,8,29,45,58,70,130};
BubbleSort(arr,sizeof(arr)/sizeof(arr[0]));
int i;
for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
2 选择排序
#include<stdio.h>
void SelectSort(int arr[],int nLength)
{
if(arr == NULL || nLength <= 0)return;
int i;
int j;
int nMin ;
for(i = 0;i<nLength;i++)
{
nMin = i;
for(j = i+1;j<nLength;j++)
{
if(arr[j] < arr[nMin])
{
nMin = j;
}
}
//将最小值放入对应位置
if(nMin != i)
{
arr[i] = arr[nMin]^arr[i];
arr[nMin] = arr[nMin]^arr[i];
arr[i] = arr[nMin]^arr[i];
}
}
}
int main()
{
int arr[] = {10,28,1,9,8,29,45,58,70,130};
SelectSort(arr,sizeof(arr)/sizeof(arr[0]));
int i;
for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
3 插入排序
#include<stdio.h>
void InsertSort(int arr[],int nLength)
{
if(arr == NULL || nLength <= 0)return;
int i; //无序的第一个
int j; //有序的最后一个
int temp;
for(i = 1;i<nLength;i++)
{
temp = arr[i];
j = i-1; //有序是无序的前一个
while(temp < arr[j] && j >= 0)
{
arr[j+1] = arr[j];
j--;
}
//元素放入
arr[j+1] = temp;
}
}
int main()
{
int arr[] = {10,28,1,9,8,29,45,58,70,130};
InsertSort(arr,sizeof(arr)/sizeof(arr[0]));
int i;
for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
4 计数排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void CountSort(int arr[],int nLength)
{
if(arr == NULL || nLength <= 0)return;
//找最大值 最小值
int nMax;
int nMin;
nMin = arr[0];
nMax = arr[0];
int i;
for(i = 1;i<nLength;i++)
{
if(arr[i] < nMin)
{
nMin = arr[i];
}
if(arr[i] > nMax)
{
nMax = arr[i];
}
}
//申请计数数组
int *pCount = NULL;
pCount = (int*)malloc(sizeof(int)*(nMax-nMin+1));
memset(pCount,0,sizeof(int)*(nMax-nMin+1));
//计数
for(i = 0;i<nLength;i++)
{
pCount[arr[i]-nMin]++;
}
//排序
int j = 0;
for(i = 0;i<nMax-nMin+1;i++)
{
while(pCount[i] != 0)
{
arr[j] = i+nMin;
j++;
pCount[i]--;
}
}
//释放
free(pCount);
pCount = NULL;
}
int main()
{
int arr[] = {10,28,10,9,8,9,4,28,7,10};
CountSort(arr,sizeof(arr)/sizeof(arr[0]));
int i;
for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
5 快排
#include<stdio.h>
int Sort(int arr[],int nLow,int nHigh)
{
int temp ;
temp = arr[nLow];
while(nLow < nHigh)
{
//从后向前找比标准值小的
while(nHigh > nLow)
{
if(arr[nHigh] < temp)
{
//放前面
arr[nLow] = arr[nHigh];
nLow++;
break;
}
nHigh--;
}
//从前向后找比标准值大的
while(nLow < nHigh)
{
if(arr[nLow] > temp)
{
//放后面
arr[nHigh] = arr[nLow];
nHigh--;
break;
}
nLow++;
}
}
//标准值放入
arr[nLow] = temp;
return nLow;
}
int Sort2(int arr[],int nLow,int nHigh)
{
int nSmall;
nSmall = nLow-1;
for(nLow;nLow<nHigh;nLow++)
{
if(arr[nLow] < arr[nHigh])
{
//小区间扩张
if(++nSmall != nLow)
{
arr[nSmall] = arr[nSmall]^arr[nLow];
arr[nLow] = arr[nSmall]^arr[nLow];
arr[nSmall] = arr[nSmall]^arr[nLow];
}
}
}
//标准值放入
if(++nSmall != nHigh)
{
arr[nSmall] = arr[nSmall]^arr[nHigh];
arr[nHigh] = arr[nSmall]^arr[nHigh];
arr[nSmall] = arr[nSmall]^arr[nHigh];
}
return nSmall;
}
void QuickSort(int arr[],int nLow,int nHigh)
{
if(arr == NULL || nLow >= nHigh)return;
int nStandard;
//找到标准值位置
nStandard = Sort2(arr,nLow,nHigh);
//根据标准值将数组分两部分
//两部分分别执行以上操作
QuickSort(arr,nLow,nStandard-1);
QuickSort(arr,nStandard+1,nHigh);
}
int main()
{
int arr[] = {10,28,1,9,8,29,45,58,70,130};
QuickSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);
int i;
for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
6 希尔排序
#include<stdio.h>
void ShellSort(int arr[],int nLength)
{
if(arr == NULL || nLength <= 0)return;
int nGap;
int i; //组
int j;
int k;
int temp;
//间隔
for(nGap = nLength/2;nGap>=1;nGap/=2)
{
//组
for(i = 0;i<nGap;i++)
{
//各组之内插入排序
for(j = i+nGap;j<nLength;j+=nGap)
{
k = j-nGap;//有序的最后一个
temp = arr[j]; //无序的第一个
while(temp < arr[k] && k >= i)
{
arr[k+nGap] = arr[k];
k-=nGap;
}
arr[nGap+k] = temp;
}
}
}
}
int main()
{
int arr[] = {10,28,1,9,8,29,45,58,70,130};
ShellSort(arr,sizeof(arr)/sizeof(arr[0]));
int i;
for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
7 归并排序
#include<stdio.h>
#include<stdlib.h>
void Merge(int arr[],int nLow,int nHigh)
{
int nBegin1;
int nBegin2;
int nEnd1;
int nEnd2;
nBegin1 = nLow;
nEnd1 = nLow+(nHigh-nLow)/2;
nBegin2 = nEnd1+1;
nEnd2 = nHigh;
int *pTemp = NULL;
pTemp = (int*)malloc(sizeof(int)*(nHigh-nLow+1));
int i = 0;
while(nBegin1 <= nEnd1 && nBegin2 <= nEnd2)
{
if(arr[nBegin1] < arr[nBegin2])
{
pTemp[i] = arr[nBegin1];
i++;
nBegin1++;
}
else
{
pTemp[i] = arr[nBegin2];
i++;
nBegin2++;
}
}
//有剩余的数组元素放入辅助空间
while(nBegin2 <= nEnd2)
{
pTemp[i] = arr[nBegin2];
i++;
nBegin2++;
}
while(nBegin1 <= nEnd1)
{
pTemp[i] = arr[nBegin1];
i++;
nBegin1++;
}
//元素放回原数组
for(i = 0;i<nHigh-nLow+1;i++)
{
arr[nLow+i] = pTemp[i];
}
//释放
free(pTemp);
pTemp = NULL;
}
void MergeSort(int arr[],int nLow,int nHigh)
{
if(arr == NULL || nLow >= nHigh)return;
int nMid;
nMid = nLow+(nHigh-nLow)/2;
//拆分
MergeSort(arr,nLow,nMid);
MergeSort(arr,nMid+1,nHigh);
//合并
Merge(arr,nLow,nHigh);
}
int main()
{
int arr[] = {10,28,1,9,8,29,45,58,70,130};
MergeSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);
int i;
for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
8 堆排序
#include<stdio.h>
#define LEFT 2*nRootID+1
#define RIGHT 2*nRootID+2
void Adjust(int arr[],int nLength,int nRootID)
{
while(1)
{
//两个孩子
if(RIGHT < nLength)
{
//两个里找大的
if(arr[LEFT]>arr[RIGHT])
{
//大的和父亲比
if(arr[LEFT] > arr[nRootID])
{
arr[LEFT] = arr[LEFT]^arr[nRootID];
arr[nRootID] = arr[LEFT]^arr[nRootID];
arr[LEFT] = arr[LEFT]^arr[nRootID];
nRootID = LEFT;
continue;
}
else
{
break;
}
}
else
{
//大的和父亲比
if(arr[RIGHT] > arr[nRootID])
{
arr[RIGHT] = arr[RIGHT]^arr[nRootID];
arr[nRootID] = arr[RIGHT]^arr[nRootID];
arr[RIGHT] = arr[RIGHT]^arr[nRootID];
nRootID = RIGHT;
continue;
}
else
{
break;
}
}
}
//一个孩子
else if(LEFT < nLength)
{
//大的和父亲比
if(arr[LEFT] > arr[nRootID])
{
arr[LEFT] = arr[LEFT]^arr[nRootID];
arr[nRootID] = arr[LEFT]^arr[nRootID];
arr[LEFT] = arr[LEFT]^arr[nRootID];
nRootID = LEFT;
continue;
}
else
{
break;
}
}
//没有孩子
else
{
break;
}
}
}
void Adjust2(int arr[],int nLength,int nRootID)
{
int MAX;
for(MAX = LEFT;MAX < nLength; MAX = LEFT)
{
//两个孩子
if(RIGHT < nLength)
{
if(arr[MAX] < arr[RIGHT])
{
MAX = RIGHT;
}
}
//大的和父亲比
if(arr[MAX] > arr[nRootID])
{
arr[MAX] = arr[nRootID]^arr[MAX];
arr[nRootID] = arr[nRootID]^arr[MAX];
arr[MAX] = arr[nRootID]^arr[MAX];
nRootID = MAX;
}
else
{
break;
}
}
}
void HeapSort(int arr[],int nLength)
{
if(arr == NULL || nLength <= 0)return;
//建堆
int i;
for(i = nLength/2-1;i>=0;i--)
{
//调整父亲节点
Adjust2(arr,nLength,i);
}
//排序
for(i = nLength-1;i>0;i--)
{
arr[0] = arr[0]^arr[i];
arr[i] = arr[0]^arr[i];
arr[0] = arr[0]^arr[i];
Adjust2(arr,i,0);
}
}
int main()
{
int arr[] = {10,28,98,27,19,30,66,0,27,1,8};
HeapSort(arr,sizeof(arr)/sizeof(arr[0]));
int i;
for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
9 桶排
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
int nValue;
struct node *pNext;
struct node *pPre;
}Bucket;
void Sort(Bucket *pHead)
{
if(pHead == NULL || pHead->pNext == NULL)return;
//插入
Bucket *pSort = NULL;
Bucket *pUnSort = NULL;
int temp;
pUnSort = pHead->pNext;
while(pUnSort != NULL)
{
pSort = pUnSort->pPre; //有序的最后一个
temp = pUnSort->nValue;//无序第一个
while(pSort != NULL && pSort->nValue > temp)
{
pSort->pNext->nValue = pSort->nValue;
pSort = pSort->pPre;
}
//值放入
if(pSort == NULL)
{
pHead->nValue = temp;
}
else
{
pSort->pNext->nValue = temp;
}
pUnSort = pUnSort->pNext;
}
}
void BucketSort(int arr[],int nLength)
{
if(arr == NULL || nLength <= 0)return;
//找最大值最小值
int i;
int nMin;
int nMax;
nMin = arr[0];
nMax = arr[0];
for(i = 1;i<nLength;i++)
{
if(arr[i] < nMin)
{
nMin = arr[i];
}
if(arr[i] > nMax)
{
nMax = arr[i];
}
}
//拆位
int nNum = nMin;
int nCount = 1;
while(nNum)
{
nNum/=10;
nCount*=10;
}
nCount/=10;
int nMinIndex;
int nMaxIndex;
nMinIndex = nMin/nCount;
nMaxIndex = nMax/nCount;
//申请桶
Bucket **pBucket = NULL;
pBucket = (Bucket**)malloc(sizeof(Bucket*)*(nMaxIndex-nMinIndex+1));
memset(pBucket,0,sizeof(Bucket*)*(nMaxIndex-nMinIndex+1));
//元素入桶
Bucket *pTemp = NULL;
for(i = 0;i<nLength;i++)
{
nNum = arr[i]/nCount-nMinIndex;
pTemp = (Bucket*)malloc(sizeof(Bucket));
pTemp->nValue = arr[i];
pTemp->pNext = pBucket[nNum];
pTemp->pPre = NULL;
if(pBucket[nNum] != NULL)
{
pBucket[nNum]->pPre = pTemp;
}
pBucket[nNum] = pTemp;
}
//各桶之内排序
for(i = 0;i<nMaxIndex-nMinIndex+1;i++)
{
Sort(pBucket[i]);
}
//桶内元素放回原数组
nNum = 0;
for(i = 0;i<nMaxIndex-nMinIndex+1;i++)
{
pTemp = pBucket[i];
while(pTemp)
{
arr[nNum] = pTemp->nValue;
nNum++;
pTemp = pTemp->pNext;
}
}
//释放
Bucket *pDel = NULL;
for(i = 0;i<nMaxIndex-nMinIndex+1;i++)
{
pTemp = pBucket[i];
while(pTemp)
{
pDel = pTemp;
pTemp = pTemp->pNext;
free(pDel);
pDel = NULL;
}
}
free(pBucket);
pBucket = NULL;
}
int main()
{
int arr[] = {1099,2208,1981,2879,3458,5629,1345,8958,2870,4130};
BucketSort(arr,sizeof(arr)/sizeof(arr[0]));
int i;
for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
10 基数排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
int nValue;
struct node *pNext;
}Radix;
void Sort(int arr[],int nLength,Radix **pRadix,int nBegin)
{
//基数
int nBase = 1;
while(nBegin > 1)
{
nBase*=10;
nBegin--;
}
//入桶
int nIndex;
int i;
Radix *pTemp = NULL;
Radix *pNode = NULL;
for(i = 0;i<nLength;i++)
{
nIndex = arr[i]/nBase%10;
pTemp = (Radix*)malloc(sizeof(Radix));
pTemp->nValue = arr[i];
pTemp->pNext = NULL;
//尾添加
if(pRadix[nIndex] == NULL)
{
pRadix[nIndex] = pTemp;
}
else
{
pNode = pRadix[nIndex];
while(pNode->pNext != NULL)
{
pNode = pNode->pNext;
}
pNode->pNext = pTemp;
}
}
//数据放回原数组
nBegin = 0;
for(i = 0;i<10;i++)
{
pNode = pRadix[i];
while(pNode)
{
arr[nBegin] = pNode->nValue;
nBegin++;
pNode = pNode->pNext;
}
}
//空间释放
for(i = 0;i<10;i++)
{
pTemp = pRadix[i];
while(pTemp)
{
pNode = pTemp;
pTemp = pTemp->pNext;
free(pNode);
pNode = NULL;
}
}
//清空表头
memset(pRadix,0,sizeof(Radix*)*10);
}
void RadixSort(int arr[],int nLength)
{
if(arr == NULL || nLength <= 0)return;
//找最大值
int i;
int nMax;
nMax = arr[0];
for(i = 1;i<nLength;i++)
{
if(arr[i] > nMax)
{
nMax = arr[i];
}
}
//拆位
int nNum = nMax;
int nCount = 0;
while(nNum)
{
nNum/=10;
nCount++;
}
//申请桶
Radix **pRadix = NULL;
pRadix = (Radix**)malloc(sizeof(Radix*)*10);
memset(pRadix,0,sizeof(Radix*)*10);
//按位入桶
for(i = 1;i<= nCount;i++)
{
Sort(arr,nLength,pRadix,i);
}
free(pRadix);
pRadix = NULL;
}
int main()
{
int arr[] = {19,208,81,9,38,529,145,858,270,30};
RadixSort(arr,sizeof(arr)/sizeof(arr[0]));
int i;
for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}