C语言中数组常用的一些排序算法小结
一.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<10-1-i;j++) { if(a[j] > a[j+1]) { //交换 temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } }
1.2选择排序
总共需要比较n-1轮
每一轮比较最多只交换一次数据(把最大数字放在最后面位置或把最小的数字放在最前面位置)
#include<stdio.h> 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<stdio.h> 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]<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<stdio.h> #include<math.h> 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.4快速排序
1先从数组中选取一个数作为基准点,可随机选择;
2 将数组中大于该基准点的放在该基准点右边,小于该基准点的放在该基准点左边;
3 对左右两个数组进行快速排序。
代码示例:
#include <stdio.h> //快速排序 有左右两边 因此我需要传进来左右的下标 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; }
附:C 语言利用数组,按从小到大的顺序排列好n个数,并输出新序列
利用数组排序,可以考虑冒泡排序
冒泡排序是最简单的交换排序方法,通过两两比较关键字,如果发生逆序,就进行交换,从而使关键字小的记录像气泡一样往上“漂浮”,或者使关键字打的记录往下“坠落”
#include<stdio.h> int main() { int i, j, n, temp; int arr[10]; for (i = 0; i < 10; i++) scanf_s("%d", &arr[i]); for (i = 0; i < 10; i++) { for (j = 0; j < 10 - i-1; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } printf("\n"); for (i = 0; i < 10; i++) printf("%d ", arr[i]); return 0; }
运行结果:随意输入10个数字
5 45 56 123 456 789 58 989 785 653
5 22 45 56 58 123 456 653 785 789
--------------------------------
Process exited after 20.02 seconds with return value 0
请按任意键继续. . .
总结
到此这篇关于C语言中数组常用的一些排序算法的文章就介绍到这了,更多相关C语言数组排序算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
详解C++中的vector容器及用迭代器访问vector的方法
使用迭代器iterator可以更方便地解引用和访问成员,当然也包括vector中的元素,本文就来详解C++中的vector容器及用迭代器访问vector的方法,需要的朋友可以参考下2016-05-05
最新评论