三种排序算法
2013-04-10 20:44 Keiven_LY 阅读(323) 评论(0) 编辑 收藏 举报1、冒泡排序
说明:
设待排序记录序列中的记录个数为n
一般地,第i趟起泡排序从1到n-i+1
依次比较相邻两个记录的关键字,如果发生逆序,则交换之
其结果是这n-i+1个记录中,关键字最大的记录被交换到第n-i+1的位置上,最多作n-1趟。
程序代码:
#include <stdio.h> main() { int a[11],i,j,t; printf("Input 10 numbers:\n"); for(i=1;i<11;i++) scanf_s("%d",&a[i]); printf("\n"); for(j=1;j<=9;j++) for(i=1;i<=10-j;i++) if(a[i]>a[i+1]) {t=a[i]; a[i]=a[i+1]; a[i+1]=t;} printf("The sorted numbers:\n"); for(i=1;i<11;i++) printf("%d ",a[i]); }
运行结果:
按ctrl+F5,出现命令框
输入10个整数如下
敲回车
按任意键后,命令框消失。
2、快速排序
注:快速排序与冒泡排序类似,都是基于交换排序思想,是冒泡排序的改进
算法描述:
- 首先设定一个分界值,提高该分界值将数组分成左右两部分
- 将大于等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于等于分界值,而右边部分中各元素都大于等于分界值
- 然后,左边和右边的数据可以再独立排序。对于左侧的数据,又可以去一个分界值,将该部分的数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以类似处理
- 重复上述过程,可以看出,这是一个递归过程。
算法实例:
#include <stdio.h> #include <stdlib.h> #include <time.h> #define SIZE 18 void QuickSort(int *arr, int left, int right) { int f,t; int rtemp,ltemp; ltemp=left; rtemp=right; f=arr[(left+right)/2]; //将中间值作为分界值 while(ltemp<rtemp) { while(arr[ltemp]<f) { ++ltemp; } while(arr[rtemp]>f) { --rtemp; } if(ltemp<=rtemp) { t=arr[ltemp]; arr[ltemp]=arr[rtemp]; arr[rtemp]=t; --rtemp; ++ltemp; } } if(ltemp==rtemp) { ltemp++; } if(left<rtemp) { QuickSort(arr,left,ltemp-1); //递归调用 } if(ltemp<right) { QuickSort(arr,rtemp+1,right); //递归调用 } } void main() { int i; int shuzu[SIZE]; srand(time(NULL)); //初始化数组 for(i=0;i<SIZE;i++) { shuzu[i]=rand()/1000+100; //随机产生个三位数的随机数,存在数组arr中 } printf("排序前:\n"); for(i=0;i<SIZE;i++) { printf("%d \0",shuzu[i]); } printf("\n"); QuickSort(shuzu,0,SIZE-1); //调用函数QuickSort,对数组进行排序 printf("排序后:\n"); for(i=0;i<SIZE;i++) { printf("%d \0",shuzu[i]); } printf("\n"); }
运行结果:
3、选择排序法
算法描述
- 首先从原始数据中选择最小的一个数据,将其和位于第一个位置的数据交换
- 接着从剩下的n-1个数据中选择次小的一个元素,将其和位于第二个位置的数据交换
- 然后,这样不断重复,知道最后两个数据交换完成。
算法实例
#include <stdio.h> #include <stdlib.h> #include <time.h> #define SIZE 10 void SelectionSort(int *a,int len) { int i,j,k,h; int temp; for(i=0;i<len-1;i++) { k=i; for(j=i+1;j<len;j++) { if(a[j]<a[k]) k=j; } if(k!=i) { temp=a[i]; a[i]=a[k]; a[k]=temp; } printf("第%d步排序结果:",i); for(h=0;h<len;h++) { printf("%d \0",a[h]); } printf("\n"); } } void main() { int i; int shuzu[SIZE]; srand(time(NULL)); //初始化数组 for(i=0;i<SIZE;i++) { shuzu[i]=rand()/1000+100; //随机产生个三位数的随机数,存在数组arr中 } printf("排序前:\n"); for(i=0;i<SIZE;i++) { printf("%d \0",shuzu[i]); } printf("\n"); SelectionSort(shuzu,SIZE); printf("排序后:\n"); for(i=0;i<SIZE;i++) { printf("%d \0",shuzu[i]); } printf("\n"); }
运行结果: