我近期做练习的时候专门为排序做了一个c程序,你看看怎么样,包括了很多排序方法
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LEN 10
//初始化数组
void init(int *arr,int len);
//打印数组元素
void print(int *arr,int len);
//打印堆元素
void printH(int *arr,int len);
//交换两个整数的值
void swap(int &a,int &b);
//简单插入排序
void inserts(int *arr,int len);
//冒泡排序
void bubbles1(int *arr,int len);
//简单选择排序
void selects(int *arr,int len);
//快速排序
void quicks(int *arr,int low,int high);
//希尔排序
void shells(int *arr,int len);
//归并
void merge(int *a,int len1,int *b,int len2,int *c);
int main()
{
int arr[LEN],brr[LEN],crr[2*LEN];
srand((unsigned)time(NULL));
init(arr,LEN);
print(arr,LEN);
bubbles1(arr,LEN);
print(arr,LEN);
init(arr,LEN);
print(arr,LEN);
selects(arr,LEN);
print(arr,LEN);
init(arr,LEN);
print(arr,LEN);
inserts(arr,LEN);
print(arr,LEN);
init(arr,LEN);
print(arr,LEN);
quicks(arr,0,LEN);
print(arr,LEN);
init(arr,LEN);
init(brr,LEN);
print(arr,LEN);
print(brr,LEN);
shells(arr,LEN);
shells(brr,LEN);
merge(arr,LEN,brr,LEN,crr);
print(crr,2*LEN);
return 0;
}
//初始化数组
void init(int *arr,int len)
{
int i;
for(i=0;i<len;i++)
{
arr[i]=rand()%1000;
}
}
//打印数组元素
void print(int *arr,int len)
{
int i;
printf("\n");
for(i=0;i<len;i++)
printf("%4d ",arr[i]);
printf("\n");
}
//打印堆元素
void printH(int *arr,int len)
{
int i;
printf("\n");
for(i=0;i<len;i++)
printf("%4d ",arr[i]);
printf("\n");
}
//交换两个整数的值,^功能为异或,相同0,相异1
void swap(int &a,int &b)
{
a=a^b;
b=a^b;
a=a^b;
}
//插入排序
void inserts(int *arr,int len)
{
int i,j,temp;
for(i=1;i<len;i++)
{
temp=arr[i];
for(j=i-1;j>=0&&arr[j]>temp;j--)
arr[j+1]=arr[j];
arr[j+1]=temp;
}
}
//冒泡排序
void bubbles1(int *arr,int len)
{
int i,j,exchange;
exchange=0;
for(i=0;i<len-1;i++)
{
for(j=0;j<len-i-1;j++)
{
if(arr[j]>arr[j+1])
{
swap(arr[j],arr[j+1]);
exchange=1;
}
}
if(!exchange)
break;
}
}
//简单选择排序
void selects(int *arr,int len)
{
int i,j,temp;
for(i=0;i<len-1;i++)
{
temp=i;
for(j=i+1;j<len;j++)
{
if(arr[j]<arr[temp])
{
temp=j;
}
}
if(temp!=i)
{
swap(arr[temp],arr[i]);
}
}
}
//快速排序
void quicks(int *arr,int low,int high)
{
int temp,l,r;
if(low<high)
{
l=low;
r=high;
temp=arr[low];
while(low<high)
{
while(low<high&&arr[high]>=temp)
high--;
if(low<high)
arr[low]=arr[high];
while(low<high&&arr[low]<=temp)
low++;
if(low<high)
arr[high]=arr[low];
}
arr[low]=temp;
quicks(arr,l,low-1);
quicks(arr,low+1,r);
}
}
//希尔排序
void shells(int *arr,int len)
{
int i,j,gap;
for(gap=len/2;gap>0;gap/=2) //步长
for(i=gap;i<len;i++)
for(j=i-gap;j>=0&&arr[j]>arr[j+gap];j-=gap)
swap(arr[j],arr[j+gap]);
}
//两有序数组合并
void merge(int *a,int len1,int *b,int len2,int *c)
{
int i=0,j=0,k=0;
while(i<len1&&j<len2)
{
if(a[i]<=b[j])
{
c[k]=a[i];
k++;
i++;
}
else
{
c[k]=b[j];
k++;
j++;
}
}
if(i<len1)
c[k++]=a[i++];
else if(j<len2)
c[k++]=b[j++];
}
2019-07-17 22:49:29