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;
}