您的位置:首页 > 其它

各种排序方法比较

2014-04-12 15:17 274 查看
冒泡法

void sort(int *ar, int num)
{
int i, j;
int t;
int flag = 0;

print(ar, num);
for(i = 1; i < num; i++)	 //num个数需要排num - 1次
{
flag = 0;
for(j = 0; j < num - i; j++)   //每次只需对前num - i个数排序
{
if(ar[j] > ar[j+1]) //如果第j个数比它后面一个数大,就要交换
{
t = ar[j];
ar[j] = ar[j+1];
ar[j+1] = t;
flag = 1;
}
}
if(flag == 0) //如果flag == 0表明本次排序没有经过一个交换,所以说明它己经有序了,就不用再循环
{
break;
}
print(ar, num);
}
print(ar, num);
}
-----------------------------------------------------------

简单排序法

void sort(int *ar, int num)
{
int i, j, t, min;

print(ar, num);

for(i = 0; i < num - 1; i++)
{
min = i;	 //假设最小的一个数的下标就是i
for(j = i + 1; j < num; j++)
{
if(ar[min] > ar[j])
{
min = j; //用min保存最小的数的下标
}
}

if(min != i)	 //把最小的那个数放到i这个位置
{
t = ar[min];
ar[min] = ar[i];
ar[i] = t;
}
}
print(ar, num);
}
---------------------------------------------

插入排序算法

void sort(int *ar, int num)
{
int i, j, t;

print(ar, num);

for(i = 1; i < num; i++)	 //取出第i个数,用来和它前面的i - 1个数进行比较
{
for(j = i - 1; j >= 0; j--)
{
if(ar[i] >= ar[j])
break;
}
if(j != i - 1)
{
t = ar[i];
memmove(&ar[j+2], &ar[j+1], (i - j - 1) * sizeof(int));  //把j之后的(i - j - 1)个数据通通向后移动一个位置
ar[j+1] = t;
}
print(ar, num);
}
print(ar, num);
}
--------------------------------------------

快速排序算法

void sort(int *ar, int left, int right)
{
int l = left, r = right;
int t;

if(r > l)
{
t = ar[l]; //从数组左边取一个数

while(r > l)
{
while(r > l)
{
if(ar[r] <= t)	 //从右边找一个比t小的数
{
ar[l] = ar[r]; //把找到的数放到ar[l]中
l++;
break;
}
r--;
}

while(r > l)
{
if(ar[l] > t) //从右边找一个比t大的数
{
ar[r] = ar[l]; //把找到的数放到ar[r]中
r--;
break;
}
l++;
}
}

ar[l] = t; //把之前的t主回到最后空出来的那个位置

sort(ar, left, l - 1);   //把序列的左半部份重复之前的排序
sort(ar, l + 1, right);  //把序列的右半部份重复之前的排序
}
}

-----------------------------------------

二分法查找

int bfind(int* a,int len,int val)
{
int m = len/2;
int l = 0;
int r = len;
while(l!=m && r!= m)
{
if(a[m] > val)
{
r = m;
m = (m+l)/2;
}
else if(a[m] < val)
{
l = m;
m = (m+r)/
9aa4
2;
}
else
return m;
}
return -1; //没有找到
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: