目录

一.C语言中数组的一些算法

1.1冒泡排序

1.2选择排序

1.3插入排序

1.4快速排序


一.C语言中数组的一些算法

把数据按照从小到大或从大到小 的顺序进行排列

有很多算法:冒泡排序、选择排序、插入排序、快速排序、计数排序、堆排序 …….

常用的有四种:

1.1冒泡排序

主要思想:

总共需要比较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 a[j+1]){//交换temp = a[j];a[j] = a[j+1];a[j+1] = temp;}}}

1.2选择排序

总共需要比较n-1轮

每一轮比较最多只交换一次数据(把最大数字放在最后面位置或把最小的数字放在最前面位置)

#includeint 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 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;}

类似的,把最小的放后面:

#includeint 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]<min){min = a[j];index = j;}}//至此我们已知最小值为 min ,他的下标为index ,交换 a[index] 所在元素和 a[i]if(index != i){temp = a[index];a[index] = a[i];a[i] = temp;}}for(i=0;i<10;i++){printf("%d ",a[i]);}printf("\n");return 0;}

1.3插入排序

算法思想:直接插入排序是无序序列插入到有序序列中,通常假定a[0]为已经排好序的子序列,然后将剩下无序序列一个一个插入到有序的子序列中。适用于基本有序和数据量不大的情况。

#include#includeint main(){int a[10] = {999,10,15,18,5,30,80,26,345,-10};int i,j;for(i=1;i=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.4快速排序

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  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;}