/*********************冒泡排序********************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<math.h>
#include<sys/types.h>
void maopao(int *a,int n)
{
int i,j,temp;
for(i=0;i<n;i++)
{
for(j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
void show(int *a,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%-3d",a[i]);
}
printf("\n");
}
int main (void)
{
int a[10] = {12,23,10,14,8,22,43,1,3,0};
maopao(a,10);
show(a,10);
return 0;
}
/***********************************选择排序***********************************/
void choise(int *a,int n)
{
int i,j,temp;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
void show(int *a,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%-3d",a[i]);
}
printf("\n");
}
int main (void)
{
int a[10] = {10,14,8,22,94,95,4,5,6,1};
choise(a,10);
show(a,10);
return 0;
}
/*******************************************插入排序********************************************/
/*include插入法
* 插 入法是一种比较直观的排序方法。
* 它首先把数组头两个元素排好序,
* 再依次把后面的元素插入适当的位置。
* 把数组元素插完也就完成了排序。*/
void insert(int *a,int n)
{
int i,j,temp;
for(i=1;i<n;i++)
{
temp = a[i];/*temp为要插入的元素*/
j = i - 1;
/*从a[i-1]开始找比a[i]小的数,同时把数组元素向后移*/
while(j>=0 && temp<a[j])
{
a[j+1] = a[j];
j--;
}
a[j+1] = temp;/*插入*/
}
}
void show(int *a,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%-3d",a[i]);
}
printf("\n");
}
int main (void)
{
int a[10] = {12,2,4,67,32,45,22,11,90,15};
insert(a,10);
show(a,10);
return 0;
}
/**************************************快速排序**************************************************/
* 快速排序
* 快速法定义了三个参数,
* (数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j)
* 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,
* 把比它小的元素放到它的左边,比它大的放在右边。
* 然后运用递归,在将它左,右两个子数组排序,
* 最后完成整个数组的排序。
* */
void quick(int *a,int i,int j)
{
int m,n,temp;
int k;
m=i;
n=j;
k=a[(i+j)/2]; /*选取的参照*/
while(m<=n)
{
while(a[m]<k&&m<j) m++; /* 从左到右找比k大的元素*/
while(a[n]>k&&n>i) n--; /* 从右到左找比k小的元素*/
if(m<=n) { /*若找到且满足条件,则交换*/
temp=a[m];
a[m]=a[n];
a[n]=temp;
m++;
n--;
}
}
if(m<j) quick(a,m,j); /*运用递归*/
if(n>i) quick(a,i,n);
}
int show(int *a,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%-3d",a[i]);
}
printf("\n");
return 0;
}
int main (void)
{
int a[10] = {23,13,1,4,2,56,78,22,10,3};
quick(a,0,9);
show(a,10);
return 0;
}
/*********************************************shell排序***********************************************************/
/*shell法
shell法是一个叫 shell 的美国人与1969年发明的。
它首先把相距k(k>=1)的那几个元素排好序,再缩小k值(一般取其一半)
再排序,直到k=1时完成排序。下面让我们来分析其代码
*/
void shell(int *a,int n)
{
int i,j,k,temp;
k = n/2;
while(k>=1)
{
for(i=k;i<n;i++) {
temp = a[i];
j=i-k;
while(j>=0 && temp<a[j]) {
a[j+k]=a[j];
j-=k;
}
a[j+k]=temp;
}
k/=2; /*缩小间距值*/
}
}
void show(int *a,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%-3d",a[i]);
}
printf("\n");
}
int main (void)
{
int a[10] = {12,19,95,94,10,14,8,22,1,4};
shell(a,10);
show(a,10);
return 0;
}