三种基本排序-冒泡排序、直接插入排序、选择排序
来源:互联网 发布:百元鼠标推荐知乎 编辑:程序博客网 时间:2024/06/08 08:34
三种基本排序-冒泡排序、直接插入排序、选择排序
冒泡排序(从大到小)
原理:对于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实现三种简单排序以及改良:冒泡排序,选择排序,直接插入排序
- 简单排序:冒泡排序、直接插入排序、直接选择排序
- 面试最基本的三种排序算法 冒泡排序 插入排序 选择排序
- 三种基本排序算法-冒泡排序,选择排序,插入排序
- 排序-基本排序-选择排序,插入排序,冒泡排序
- 三大基本排序:选择、冒泡、插入
- 三大基本排序冒泡、插入、选择
- 三大基本排序--选择、冒泡、插入
- 排序之----冒泡,直接插入,选择排序
- 菜鸟学编程之三:三种最基本排序算法的实现(冒泡排序、选择排序、直接插入排序)
- 排序01:冒泡排序 选择排序 直接插入排序
- 冒泡排序,选择排序,直接插入排序,二分查找排序
- 冒泡排序、直接插入排序、选择插入排序
- 留着这些话激励自己
- 并查集 Union_Find_Set
- 最后的纪念
- 工作了
- 斜堆头文件C语言
- 三种基本排序-冒泡排序、直接插入排序、选择排序
- 斜堆实现文件C语言
- discuz 7论坛防止垃圾贴的简便快捷方法
- winform DataGridView单击选中一整行,只能单选,不能选择多行,只能选择一行
- 程序员的十个层次
- 非递归八皇后之莫名奇妙搞定了。。
- C语言 文件操作相关
- WinFrom 打开新窗口关闭当前窗口
- Enhancing ColdFusion Script Protection - Security Series #10