目录
一.C语言中数组的一些算法
1.1冒泡排序
1.2选择排序
1.3插入排序
1.4快速排序
把数据按照从小到大或从大到小 的顺序进行排列
有很多算法:冒泡排序、选择排序、插入排序、快速排序、计数排序、堆排序 .......
常用的有四种:
主要思想:
总共需要比较n-1轮
每一轮依次比较当前元素和后面的元素,如果当前元素比后面元素大,则交换他们的位置
int a[10] = {50,23,80,18,100,5,10,58,30,2};
第一轮:
23,50,18,80,5,10,58,30,2,100
第二轮:
23,18,50,5,10,58,30,2,80,100
......
for(i=0;i<10-1;i++)//比较10-1轮
{
for(j=0;j<10-1-i;j++)
{
if(a[j] > a[j+1])
{
//交换
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
总共需要比较n-1轮
每一轮比较最多只交换一次数据(把最大数字放在最后面位置或把最小的数字放在最前面位置)
#include
int main()
{
int a[10] = {50,23,80,18,100,5,10,58,30,2};
int i,j;
int temp;
for(i=0;i<10-1;i++)//进行n-1轮比较
{
int max = a[0];//假设最大的数字是a[0]
int index = 0;//用来保存最大值的下标
for(j=0;j<10-i;j++)//每一轮比较把最大的数字放在最后面
{
if(a[j] > max)
{
max = a[j];
index = j;
}
}
//至此我们已经最大值为 max, 他的下标为index ,交换 a[index] 所在元素和 a[9-i]
if(index != 9-i)
{
temp = a[index];
a[index] = a[9-i];
a[9-i] = temp;
}
}
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
类似的,把最小的放后面:
#include
int main()
{
int a[10] = {50,23,80,18,100,5,10,58,30,2};
int i,j;
int temp;
for(i=0;i<10-1;i++)
{
//每一轮比较把最小的数字放在最前面
int min = a[9];
int index = 9;
for(j=0+i;j<10;j++)
{
if(a[j]
算法思想:直接插入排序是无序序列插入到有序序列中,通常假定a[0]为已经排好序的子序列,然后将剩下无序序列一个一个插入到有序的子序列中。适用于基本有序和数据量不大的情况。
#include
#include
int main()
{
int a[10] = {999,10,15,18,5,30,80,26,345,-10};
int i,j;
for(i=1;i<10;i++)//总共需要插入9轮
{
//把 a[i] 插入到前面的有序集合中,使之仍然有序
int data = a[i];
for(j=i-1;j>=0;j--)
{
if(a[j]>data)
{
a[j+1] = a[j];
}
else
{
a[j+1] = data;
break;
}
}
if(j==-1)
{
a[0] = data;
}
}
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
1先从数组中选取一个数作为基准点,可随机选择;
2 将数组中大于该基准点的放在该基准点右边,小于该基准点的放在该基准点左边;
3 对左右两个数组进行快速排序。
代码示例:
#include
//快速排序 有左右两边 因此我需要传进来左右的下标
void FastSort(int a[],int left,int right)
{
//当左边比右边不得小 我们就没有必要排序了
if(left >= right)
return;
int l = left;
int r = right;
//设置基准点 我这里设置的是第一个
int temp = a[left];
//将我们的数组进行一次快排
//将temp的左边变得都比temp小,右边都比temp大
while(l < r)
{
//由于你的基准点是在左边第一个 因此首先就要从右边找到左边
//将右边小于基准点的元素弄到左边去
for(;r > l;r--)
{
if(temp > a[r])
{
//将这个小一点的数弄到左边去
a[l] = a[r];
break;
}
}
//然后从左边找到右边去 找到比基准点大的 放在右边去
for(;r > l;l++)
{
if(temp < a[l])
{
//将大的数弄到右边去
a[r] = a[l];
break;
}
}
}
a[l] = temp;//恢复基准点
//以相同的规则将左边的排序
FastSort(a,left,l - 1);
//以相同的规则将右边排序
FastSort(a,r + 1,right);
}
//打印数组
void PrintArr(int arr[],int n)
{
for(int i = 0;i < n;i++)
printf("%d ",arr[i]);
printf("\n");
}
int main()
{
int a[] = {12378,34,412,453,34,25,4,432,5,43};
FastSort(a,0,sizeof(a) / sizeof(a[0]) - 1);
PrintArr(a,sizeof(a) / sizeof(a[0]));
return 0;
}