总所周知C语言没有封装好的排序函数,所以就要自己写,所以我就总结了几种比较简单的排序方法函数。
#include<stdio.h>
#include<string.h>
/* 3s
void f1(int s[],int n)
{//直接插入
int i,j=0,flag;
for(i=1;i<n;i++)
{
flag=s[i];
for(j=i-1;j>=0;j--)
{
if(flag>s[j])
break;
else
s[j+1]=s[j];
}
s[j+1]=flag;//0.060 s
//或是下面这种写法
flag=s[i];
j=i-1;
while(j>=0&&flag<s[j]) //比插入元素大的元素进行后移操作
{
s[j+1]=s[j];
--j;
}
s[j+1]=flag;
///0.050 s
}
}
*/
/*(void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}*/
/*4s
void f2(int s[],int n)
{//直接选择排序
int i,j,flag,t;
for(i=0;i<n-1;i++)
{
flag=i;
for(j=i+1;j<n;j++)
{
if(s[j]<s[flag])
flag=j;
}
if(flag!=i)
{
t=s[flag];
s[flag]=s[i];
s[i]=t;
//1.437 s 0.050 s 0.108 s
//s[flag] ^= s[i] ^= s[flag] ^= s[i];//0.050 s 0.040 s
}
}
//return s[i];
}
*/
/*5s
void f3(int s[],int n)
{//冒泡排序
int i,j,k;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
if(s[j+1]<s[j])
{
k=s[j];
s[j]=s[j+1];
s[j+1]=k; //0.190 s 0.220 s 0.156 s
//s[j+1]^=s[j]^=s[j+1]^=s[j];//0.203 s 0.279 s
}
}
}
*/
/*5s
void f4(int n[],int s,int t)
{
int i,j;
if(s<t)
{
i=s;j=t+1;
while(1)
{
do
{
i++;
}while(!(n[s]<=n[i]||i>t));
do
{
j--;
}while(!(n[s]>=n[j]||j<=s));
if(i<j)
n[i]^=n[j]^=n[i]^=n[j];
else
break;
}
if(n[j]!=n[s])
n[j]^=n[s]^=n[j]^=n[s];
f4(n,s,j-1);
f4(n,j+1,t);
}
}//1.823 s 0.339 s 0.288 s
*/
int[] f5(int[] n)
{
int low=0,mid=0,high=9;
int temp=0;
for(int i=0;i<9;i++){
temp=n[i];
while(low<=high)
{
mid=(low+high)/2;
if(temp<n[mid])
high=mid-1;`
else
low=mid+1;
}
for(int j=i-1;j>=low;j--)
{
n[j+1]=n[j];
}
if(low!=i) n[low]=temp;}
return n;
}
int main()
{
int n[10]={7,8,2,1,5,3,6,1,0,5};
int i = 0;
f1(n,10);
//f2(n,10);
//f3(n,10);
//f4(n,0,9);
for (i = 0; i < 10; i++)
{
printf("%d ", n[i]);
}
return 0;
}
//四种方法任选一种,但效率有别
//一般情况下:快速排序>直接插入>直接选择==冒泡
之前就只会冒泡,傻傻的,现在觉得直接插入还蛮好用的。