算法之排序——交换排序(选择排序,冒泡排序)
2013-11-13 14:05
239 查看
选择排序:
选择排序是交换排序的一种,从字面上理解就是交换元素以达到排序的目的。
选择排序算法的基本思想是对待排序的元素序列a[l]~a[r]进行r-l遍处理,第i遍处理是将第i小的元素放到第i个位置上,这样排序i次后前i小的元素都已经确定,下一次排序从第i+1个位置开始,对之后的元素与第i+1个元素进行比较,如果找到某元素比第i+1个位置上的元素还小,则交换。
C语言代码:
冒泡排序:
冒泡排序也是交换排序的一种,这种方法的基本思想是,将待排序的记录看作是竖着排序的“气泡”,键值较小的记录比较轻,因而要上浮。在冒泡排序算法中,要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的记录的顺序是否正确。如果发现两个相邻记录的顺序不对,即“轻”的记录在下,就要变换它们的位置。处理一遍之后,“最轻”的记录就浮到了最高的位置,处理两遍之后,“次轻”的记录就浮到了次高位置。在处理第二遍时,由于最高位置上的记录已经是最轻记录,所以不必检查。一般的,第i遍处理时,不必检查第i高位置以上的记录。
C语言代码:
选择排序是交换排序的一种,从字面上理解就是交换元素以达到排序的目的。
选择排序算法的基本思想是对待排序的元素序列a[l]~a[r]进行r-l遍处理,第i遍处理是将第i小的元素放到第i个位置上,这样排序i次后前i小的元素都已经确定,下一次排序从第i+1个位置开始,对之后的元素与第i+1个元素进行比较,如果找到某元素比第i+1个位置上的元素还小,则交换。
C语言代码:
//选择排序所用的时间n*n,对于数比较多的时候相当费时 //选择排序是交换排序的一种 #include<stdio.h> #include<malloc.h>//为了使用malloc函数 int count=0;//定义为局部变量,记录比较次数 int sum=0;//定义为全局变量,记录交换次数 void sort(int *a,int n) { int i,j,t; for( i=0;i<n-1;i++) //n个数只要做n-1次排序,每次排序将小的数放到第i个位置上 { for( j=i+1;j<n;j++) //每次从第i+1个数开始,因为第i+1个之前已经有序 { count++;//比较一次+1 if(a[i]>a[j]) //第i个位置的数与之后的数比较,如符合条件,则进行交换 { sum++;//交换一次+1 t = a[i]; a[i] = a[j]; a[j] = t; } } } } int main() { int *a; //声明一个int 型指针 int n=10,t,i;//n可以自由输入,此处定义n=10; a=(int *)malloc(sizeof(int)*n); //动态分配一片n个int 的空间 , 即数组a ; for( i=0;i<n;i++) //输入n个数,并存储在数组中 scanf("%d",&a[i]); sort(a,n);//调用排序函数 for(i=0;i<n;i++) //打印排序之后的数组 printf("%d ",a[i]); printf("\n比较次数:%d\n交换次数:%d\n",count,sum); //输出比较次数和交换次数 return 0; }
冒泡排序:
冒泡排序也是交换排序的一种,这种方法的基本思想是,将待排序的记录看作是竖着排序的“气泡”,键值较小的记录比较轻,因而要上浮。在冒泡排序算法中,要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的记录的顺序是否正确。如果发现两个相邻记录的顺序不对,即“轻”的记录在下,就要变换它们的位置。处理一遍之后,“最轻”的记录就浮到了最高的位置,处理两遍之后,“次轻”的记录就浮到了次高位置。在处理第二遍时,由于最高位置上的记录已经是最轻记录,所以不必检查。一般的,第i遍处理时,不必检查第i高位置以上的记录。
C语言代码:
//选择排序所用的时间n*n,对于数比较多的时候相当费时 //选择排序是交换排序的一种 #include<stdio.h> #include<malloc.h>//为了使用malloc函数 int count=0;//定义为局部变量,记录比较次数 int sum=0;//定义为全局变量,记录交换次数 void sort(int *a,int n) { int i,j,t; for(i=0;i<n-1;i++) //共处理n-1遍 { for(j=0;j<n-1-i;j++) //每次比较到第 n-2-i个位置,一遍结束后将最小的数浮到该位置,依次上浮到a[n-1],a[n-2],a[n-3]; { count++;//比较一次+1 if(a[j]<a[j+1]) { sum++;//交换一次+1 t=a[j]; a[j] = a[j+1]; a[j+1] = t; } } } } int main() { int *a; //声明一个int 型指针 int n=10,i;//n可以自由输入,此处定义n=10; a=(int *)malloc(sizeof(int)*n); //动态分配一片n个int 的空间 , 即数组a ; for(i=0;i<n;i++) //输入n个数,并存储在数组中 scanf("%d",&a[i]); sort(a,n);//调用排序函数 for(i=0;i<n;i++) //打印排序之后的数组 printf("%d ",a[i]); printf("\n比较次数:%d\n交换次数:%d\n",count,sum); //输出比较次数和交换次数 return 0; }
相关文章推荐
- 常用的选择排序.Shell排序.快速排序.冒泡排序.插入排序的算法
- PHP数据结构基本算法一:矩阵转置 求素数 冒泡排序 选择排序
- 算法笔记_008:选择排序和冒泡排序【蛮力法】
- [置顶] 【算法】选择排序和冒泡排序
- 算法 ----- 排序lowB三人组 冒泡排序 选择排序 插入排序
- 蛮力算法: 选择排序 冒泡排序(详解)
- 简单排序算法:冒泡排序(交换排序)
- 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)
- 算法(三)初等排序后篇[选择和冒泡排序]
- 算法 -- iOS开发用Objective_C / Swift3.0实现:快速排序 / 冒泡排序 / 选择排序
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 排序算法---基础算法(冒泡排序,快速排序,选择排序,直接插入排序,桶排序)
- 算法系列(三)排序算法上篇--冒泡排序插入排序和选择排序
- 冒泡排序、选择排序、插入排序 算法实现
- 算法:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)和选择排序(Selection Sort)总结
- 算法---冒泡排序,快速排序,二分查找(折半查找),选择排序,插入排序
- 快速排序,冒泡排序,直接选择排序的算法
- 数据结构与算法——冒泡排序、选择排序和快速排序
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
- 算法(一):选择排序和冒泡排序