算法篇之排序(一)
来源:互联网 发布:vmware12上的mac补丁 编辑:程序博客网 时间:2024/06/18 04:46
一、概述
我们常说的排序就是将一组数据按一定顺序排列起来,以便方便查询和处理。排序大致分为两类:内部排序和外部排序,区别在于是否需要访问外存。这里不展开讲解。
二、常见排序算法
1、冒泡排序法
博主认为冒泡排序可以算是一种接触地非常频繁的算法。其基本思想是:从后往前进行多次扫描,当发现相邻两个关键字的次序与排序要求不符时,将这两个数据进行位置交换。当然了,说得再多,还不如看个demo来得快。假设现有6个数据,需要将其按从小到大排序。为便于读者理解,直接上代码。
#include <stdio.h>#include <stdlib.h>#define ARRAYLENGTH 6 int main(){ int temp; //temp为临时值 int data[ARRAYLENGTH] = {23, 15, 2, 92, 65, 132}; //需要排序的数据 //int flag = 0; //设置标志flag for(int i = 0; i < ARRAYLENGTH - 1; i++) //总共6个数据,因此需要5次排序 ,每次冒泡按从后往前的顺序将最小的数据往前推 { for (int j = ARRAYLENGTH - 1; j >= i; j--) //将相邻的数据进行,若前一个数据大于后一个就将两个数据交换位置 { if(data[j-1] > data[j]) { temp = data[j-1]; data[j-1] = data[j]; data[j] = temp; //flag = 1; //若相邻数据交换位置,则将flag赋值为1 } } //if(flag == 0) break; //若flag为0,则跳出排序 //else flag = 0; //若flag为1,则将flag重置为0,并继续进行冒泡排序 } for(int i = 0; i < 6; i++) //将得到排好序的数据输出 { printf("%d ",data[i]); } system("pause"); return 0;}
从上可以看出如果将长度为6的数据组排序需要5次冒泡,但如果两次冒泡后已经按要求排序,剩下的执行将做无用功。如何解决这个问题呢?我们可以加入一个初始值为0的标志flag。每次冒泡后,如有顺序改动将flag赋值为1。在执行完内循环后进行判断flag的值,若为1,则跳出循环。
2、快速排序法
快速排序法是一种对冒泡排序的改进。其基本思想:第一遍排序时,将数据组分为两组,一组比标准值大,一组比标准值小。再对这两组数据分别进行快速排序。这里涉及到了递归的概念。不多说,上代码。
#include <stdio.h>#include <stdlib.h>#define ARRAYLENGTH 6int Division(int a[], int left, int right){ int base = a[left]; //设置基准值base为最左边的数 while(left < right) { while((left < right) && (a[right] > base)) //从右向左寻找第一个小于基准值的数 right--; a[left] = a[right]; //将该数移到最左边 while((left < right) && (a[left] < base)) //从左向右寻找第一个大于基准值的数 left++; a[right] = a[left]; //将该数移到最右边 } a[left] = base; //将最小值设为基准 return left; //返回最小值的位置 }void QuickSort(int a[], int left, int right) //快速排序 { int i; if(left < right) { i = Division(a,left,right); //分割数据 QuickSort(a,left,i-1); QuickSort(a,i+1,right); }} int main(){ int temp; //temp为临时值 int data[ARRAYLENGTH] = {23, 15, 2, 92, 65, 132}; //需要排序的数据 QuickSort(data,0,ARRAYLENGTH-1); //进行快速排序 for(int i = 0; i < 6; i++) //将得到排好序的数据输出 { printf("%d ",data[i]); } system("pause"); return 0;}
3、简单选择排序法
简单选择排序,顾名思义,每一次排序,选择最小的数据输出。博主认为这比较符合人类的思想。举个简单的demo。
#include <stdio.h>#include <stdlib.h>#define ARRAYLENGTH 6void SelectSort(int a[],int n) //简单选择排序 { int i,j,k,temp; for(i = 0; i < n-1; i++) { k = i; for(j=i+1; j<n; j++) if(a[k] > a[j]) k = j; //找出最小值的位置 temp = a[i]; a[i] = a[k]; a[k] = temp; }}int main(){ int temp; //temp为临时值 int data[ARRAYLENGTH] = {23, 15, 2, 92, 65, 132}; //需要排序的数据 SelectSort(data, ARRAYLENGTH); //简单选择排序 for(int i = 0; i < 6; i++) //将得到排好序的数据输出 { printf("%d ",data[i]); } system("pause"); return 0;}
本文暂时写到这里,在下一篇文章中,博主将讲述堆排序、直接插入排序、希尔排序、合并排序。
0 0
- 算法篇之排序(一)
- 算法之排序(一)
- 算法之 排序算法 (一) Java
- 算法导论排序算法之插入排序(一)
- 经典排序算法之实现(一)
- 数据结构算法之排序(一)
- 数据结构之排序算法(一)
- 笔试之排序算法(一)
- 排序算法之冒泡(一)
- 开贴聊八大排序算法之直接插入排序(一)
- 排序算法总结之位排序(一)
- 排序算法之——冒泡排序(一)
- 算法铺子之排序---快速排序(一)
- 算法铺子之排序---堆排序(一)
- 重拾算法之排序(一):直接插入排序
- 算法学习之排序算法(一)(冒泡法)
- 算法学习之排序算法(一)(冒泡法)
- 浅谈排序算法(一)之冒泡排序
- Codeforces Round #271 (Div. 2)
- 别样JAVA学习(六)继承下(2.1)内部类下
- hdoj 1228 A + B()map容器
- 体验云计算的成果----亚马逊免费云计算服务
- applicationContext.xml和dispatch-servlet.xml的区别及引发的问题和教训
- 算法篇之排序(一)
- 树的最大独立集 《算法竞赛入门经典》P171
- Android学习之 换肤功能模块的实现<二>
- HDoj-1018-Big Number
- Android ActionBar 的使用
- 题目1434:今年暑假不AC 题目22
- 自定义BufferedReader的两个方法
- [安卓]成功在android平台用ndk上编译libcurl+openssl支持https
- JAVA_04 集合框架