三种基本排序-冒泡排序、直接插入排序、选择排序
2010-10-29 11:25
295 查看
冒泡排序(从大到小)
原理:对于n个数,需要进行n-1次扫描,每次扫描通过相邻两个数的比较,找出最大的数,放到数列顶部。
程序:
1.冒泡排序1:每次扫描把下一个元素和最前面的元素比较,一次扫描结束后,最大的元素就在最前面了。
2.冒泡排序2:每扫描一次,通过相邻两个元素的比较,使得最小或最大的数位于顶部。
3.冒泡排序3。对冒泡排序的改进方法:通过加入exchange变量用来判断每次扫描是否发生数值交换,如果哪次扫描没有发生数值交换,则已经排序好,无需进行下次扫描,减少了时间复杂度。
以上三个简单的冒泡算法中,用了三种不同的数值交换方法:加减法、置换法、位运算法。其中位运算法效率最高。
以上排序均为从大到小排序,若要从小到大,只做少许改动即可,原理相同!
直接插入排序
原理:每次执行,把后面的数插入到前面已经排序好的数组中,直到最后一个完成。
选择排序
原理:每次从待排序的记录中选出最大的数,放入已排好序的子文件中,直到全部记录完成。
以下为main函数及数组打印函数:
以上三种简单排序算法,都是从大到小的排序!
原理:对于n个数,需要进行n-1次扫描,每次扫描通过相邻两个数的比较,找出最大的数,放到数列顶部。
程序:
1.冒泡排序1:每次扫描把下一个元素和最前面的元素比较,一次扫描结束后,最大的元素就在最前面了。
void bubble_sort1(int a[],int len) { int i,j; for (i=0; i<len-1; i++) { for (j=i+1; j<len; j++) { if (a[i] < a[j]) { /***数值交换方法3-位运算******/ a[i]^= a[j]; a[j]^= a[i]; a[i]^= a[j]; } } } }
2.冒泡排序2:每扫描一次,通过相邻两个元素的比较,使得最小或最大的数位于顶部。
void bubble_sort2(int a[],int len) { int i,j; for (i=0; i<len-1; i++) //扫描次数len-1 { for (j=len-1; j>i; j--) { if (a[j] > a[j-1]) { /***数值交换方法1--加减法****** a[j]+=a[j-1]; a[j-1] = a[j] - a[j-1]; a[j] = a[j] - a[j-1]; } } } }
3.冒泡排序3。对冒泡排序的改进方法:通过加入exchange变量用来判断每次扫描是否发生数值交换,如果哪次扫描没有发生数值交换,则已经排序好,无需进行下次扫描,减少了时间复杂度。
void bubble_sort3(int a[],int len) { int i,j; int exchange = 0; //用户标识是否发生过排序,用作冒泡的改进 int temp; for (i=0; i<len-1; i++) //扫描次数len - 1 { exchange = 0; //每次扫描前对exchange置0 for (j=len-1; j>i; j--) { if (a[j] > a[j-1]) { /***数值交换方法2--临时变量置换法******/ temp = a[j]; a[j] = a[j-1]; a[j-1] = temp; exchange = 1; //如果还有排序,则exchange 为1 } } if (exchange == 0) //如果此次扫描没有发生过交换,则说明已经全部排序好,不需要进行下次扫描 { return; } } }
以上三个简单的冒泡算法中,用了三种不同的数值交换方法:加减法、置换法、位运算法。其中位运算法效率最高。
以上排序均为从大到小排序,若要从小到大,只做少许改动即可,原理相同!
直接插入排序
原理:每次执行,把后面的数插入到前面已经排序好的数组中,直到最后一个完成。
/****************直接插入排序**************/ void directinsert_sort(int a[], int len) { int i,j; int temp; for (i=1; i<len; i++) // { temp = a[i]; for (j=i-1; j>=0; j--) { if (temp < a[j]) //如果插入的值小于某个值,则退出循环 break; a[j+1] = a[j]; } a[j+1] = temp; } }
选择排序
原理:每次从待排序的记录中选出最大的数,放入已排好序的子文件中,直到全部记录完成。
/****************选择排序************/ void select_sort(int a[], int len) { int i,j; int max,k; //最大值及其下标 for (i=0; i<len-1; i++) //遍历len-1次 { max = a[i]; //每次遍历前max 和 k的设置 k = i; for (j=i+1; j<len; j++) //每次取得剩余的最大值,及其下标 { if (a[j] > max) { max = a[j]; k = j; } } a[k] = a[i]; a[i] = max; } }
以下为main函数及数组打印函数:
/**********打印数组函数*************/ void print_array(int a[], int len) { for (int i=0; i<len; i++) { cout<<a[i]<<" "; } cout<<endl; } int main() { int a[10]={3,5,7,5,2,7,8,4,1,30}; cout<<"排序前:"; print_array(a,10); bubble_sort2(a,10); //冒泡排序 // select_sort(a,10); //选择排序 //directinsert_sort(a,10);//插入排序 cout<<"排序后:"; print_array(a,10); return 0; }
以上三种简单排序算法,都是从大到小的排序!
相关文章推荐
- 菜鸟学编程之三:三种最基本排序算法的实现(冒泡排序、选择排序、直接插入排序)
- 三种基本排序-冒泡排序、直接插入排序、选择排序
- java实现三种简单排序以及改良:冒泡排序,选择排序,直接插入排序
- 三种最简单基础的排序 选择排序 冒泡排序 直接插入排序 运用了函数指针数组
- 冒泡排序 快速排序 选择排序 堆排序 直接插入排序 希尔排序 归并排序
- 简单排序:冒泡排序、直接插入排序、直接选择排序
- 各种基本排序(直接插入;希尔;选择;堆;冒泡;快排)
- 插入排序是基本排序算法中最好的一种,虽然插入排序也是需要O(N^2)时间,但它比冒泡排序快一倍,比选择排序还要快点。
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
- C语言 冒泡排序 快速排序 直接插入排序 选择排序
- 三种基本排序算法-冒泡排序,选择排序,插入排序
- 三个简单、基本的排序算法---插入排序、选择排序、冒泡排序
- oc中的排序 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序
- 排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序...)
- java版排序算法简介及冒泡排序以及优化,选择排序,直接插入排序,希尔排序,堆排序,快速排序及其优化前言 2 分类 2 稳定性 3 时间复杂度 4 Java实现版本 5 1、冒泡排序 6 2、选择排序
- 排序算法: 冒泡排序, 快速排序,希尔排序,直接插入排序 ,直接选择排序,归并排序,堆排序
- 排序算法(快速排序、直接插入排序、直接选择、冒泡排序)
- 冒泡排序、直接插入排序、选择插入排序
- 数据结构与算法——冒泡排序,选择排序,直接插入排序
- 排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序,堆排序)