排列算法
对数据大批量操作可以利用数组,但大部分情况下数组中的数据需要经过排序才能够被利用。
数组排序即将数组中的数据按照一定顺序进行排列,一般分为升序排列和降序排列;升序排列指数据按从小到大的顺序排列,反之即为降序排列。下列算法举例均默认为升序排列。
数组的排列算法一般有四种:选择排列、冒泡排列、插入排列、快速排列。
选择排列:
选择排列的思路为选择最低位数,将其依次与其他数进行比较,如果在比较过程中找到比他小的数,两个数交换位置,继续用最低位数(此时为交换过的较小数)与剩余数进行比较,直到确定最低位数为最小值;取次低位重复此前的操作,直到确定次高位数小于最高位数。此时最高位为最大数,最低位为最小值,即完成升序排列操作。
流程图:
示例代码:
#include <stdio.h>
//选择 升序
int main(void)
{
int i,j,len,tmp;
printf("Input length of the array:\n");
scanf("%d",&len);
if(len < 0)
{
printf("Input error! Try again.\n");
return -1;
}
int arr[len];
printf("Input %d numbers of array:\n",len);
//输入
for(i=0;i<len;++i)
{
scanf("%d",&arr[i]);
}
printf("--- --- --- ---\n");
//排序
for(i=0;i<len;++i)
{
for(j=i+1;j<len;++j)
{
if(arr[j] < arr[i])
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
//输出
printf("--- --- --- ---\n");
for(i=0;i<len;++i)
{
printf("%d\n",arr[i]);
}
return 0;
}
运行结果 :
./select_up
Input length of the array:
5
Input 5 numbers of array:
5 -1 6 -8 30
--- --- --- ---
-8
-1
5
6
30
冒泡排序:
冒泡排序的思路为,确定最大值:取出第一个数据,向右与下一位相邻数据进行比较,通过交换将其中较大的值放置在高位,将其中较大的值与向右下一位相邻数据进行比较,通过交换将其中较大的值放置在高位,以此循环,直到与最高一位比较完。此时可以确定最高位数为数组中最大的值。
确定最大值后需要确定次大值:依然从最低位开始,与向右下一位相邻数据进行比较,通过交换将其中较大值放置在高位,将其中较大的值与向右下一位相邻数据进行比较,通过交换将其中较大值放置在高位,以此循环,直到与次高位比较完。此时可以确定次高位数位数组中次大值。
同样的步骤一直进行下去,直到最低位与次低位数比较完,此时可以确定最大值、次大值、次次大值....直到最小值。此时即完成了数组的升序排列。
整体思想与选择排列相同:每次通过比较求出最大值,并放置在末位,最终得到升序数组。
示例代码:
#include <stdio.h>
//冒泡 升序
int main(void)
{
int in,out,tmp,len;
printf("Input length of the array:\n");
scanf("%d",&len);
int array[len];
printf("Input %d numbers of the array:\n",len);
//输入
for(in = 0;in < len;++in)
{
scanf("%d",&array[in]);
}
//排序
for(out=0;out<len-1;++out)
{
for(in=0;in<len-1-out;++in)
{
if(array[in] > array[in+1])
{
tmp = array[in];
array[in] = array[in+1];
array[in+1] = tmp;
}
}
}
//输出
printf("--- --- --- ---\n");
for(in=0;in<len;++in)
{
printf("%d\n",array[in]);
}
}
运行结果:
./bubble_up
Input length of the array:
5
Input 5 numbers of the array:
6 -1 3 -8 4
--- --- --- ---
-8
-1
3
4
6
插入排列:
插入排列的思路为一次将将数据取出,从原始位置判断是否为合适位置:取出次低位数据,判断上一位数据(即最低位数)是否大于次低位数据,如果大于则将最低位数右移,将原先次低位数据填入最低位;取出第三低位数,判断次低位数据是否大于第三低位数据,如果大于则将次低位数右移一位到第三低位,此时原先第三低位数变为次低位数,此时判断最低位数是否大于次低位数,如果大于则将最低位数右移一位到次低位,此时原先次低位数变为最低位数。一次重复,将每一位数取出与前一位数进行判断大小,将较大数右移,较小数补位,直到这一位数放置到合适的位置。最终确定最高位数的位置之后,即完成了升序排列。
示例代码:
#include <stdio.h>
//插入 升序
int main(void)
{
int a,b,tmp,len;
printf("Input the length of the array:\n");
scanf("%d",&len);
int arya[len],aryb[len];
printf("Input %d numbers of the array:\n",len);
//输入
for(a=0;a<len;++a)
{
scanf("%d",&arya[a]);
}
//排序
aryb[0] = arya[0];
for(a=1;a<len;++a)
{
tmp = arya[a];
b = a;
while(b > 0 && aryb[b-1] > tmp)
{
aryb[b] = aryb[b-1];
--b;
}
aryb[b] = tmp;
}
//输出
printf("--- --- --- ---\n");
for(a=0;a<len;++a)
{
printf("%d\n",aryb[a]);
}
return 0;
}
运行结果:
./select_up
Input length of the array:
5
Input 5 numbers of array:
9 -1 6 40 -3
--- --- --- ---
-3
-1
6
9
40
查找算法
查找算法的常规思路为二分法,即将数据一分为二,确定要查找的数据在哪个范围中,每次折半从而缩小查找范围。最终确定到要查找数的位置。
是用二分法进行查找的前提为数据为有序排列,否则二分法将无意义。
示例代码:
#include <stdio.h>
//插入法升序排列 二分法查找
int main(void)
{
//输入长度
int i,len;
printf("Input length of the array:\n");
scanf("%d",&len);
//输入数组
int ary[len];
printf("Input %d numbers of the array:\n",len);
for(i=0;i<len;++i)
scanf("%d",&ary[i]);
//输入被查找数
int x,tmp;
printf("Input the number need to find:\n");
scanf("%d",&x);
//升序排序
for(i=1;i<len;++i)
{
tmp = ary[i];
while(i>0 && tmp < ary[i-1])
{
ary[i] = ary[i-1];
--i;
}
ary[i] = tmp;
}
//打印正序数组
printf("array:\n");
for(i=0;i<len;++i)
{
printf("%d ",ary[i]);
}
printf("\n");
//查找
int begin,end,mid;
begin = 0;
end = len - 1;
while(begin <= end)
{
mid = (begin + end) / 2;
if(x < ary[mid])
end = mid - 1;
else if(x > ary[mid])
begin = mid + 1;
else
break;
}
//显示结果
if(begin <= end)
printf("ary[%d] = %d\n",mid,x);
else
printf("%d not found!\n",x);
return 0;
}
运行结果:
./insert_search
Input length of the array:
5
Input 5 numbers of the array:
9 -1 3 -7 2
Input the number need to find:
2
array:
-7 -1 2 3 9
ary[2] = 2
插入排序流程图来源:https://blog.csdn.net/u010039043/article/details/118440114