算法:三种简单排序算法
2017-04-19 16:58
176 查看
排序算法比較常见的有:冒泡排序、简单选择排序、直接插入排序;希尔排序、堆排序、归并排序和高速排序算法等。
今天先学习一下前面三种比較简单的算法。排序的相关概念:
①排序的稳定性:两个或多个元素相等。排序过后仍然是原来的顺序则为稳定排序。
②内部排序:排序过程都在内存中进行;外部排序:须要对外存进行訪问的排序过程。
③内排序算法性能因素:1、时间性能,比較与移动;2、辅助空间;3、算法复杂性
实例:冒泡排序、简单选择排序与直接插入排序
小结:三种简单排序算法的时间复杂性都是O(n^2),都是稳定的排序。
今天先学习一下前面三种比較简单的算法。排序的相关概念:
①排序的稳定性:两个或多个元素相等。排序过后仍然是原来的顺序则为稳定排序。
②内部排序:排序过程都在内存中进行;外部排序:须要对外存进行訪问的排序过程。
③内排序算法性能因素:1、时间性能,比較与移动;2、辅助空间;3、算法复杂性
实例:冒泡排序、简单选择排序与直接插入排序
#include "stdio.h" #define MAXSIZE 6 int data[MAXSIZE] = {0,5,4,3,2,1}; /* * 功能:数组元素交换 * 输入:数据、交换元素的下标 * 输出:无 */ void swap(int data[],int i,int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; } /* * 功能:冒泡排序 * 输入:数组 * 输出:无 * 算法:循环一次。下标所在位置即为最小值。不断地比較和移动 */ void bubble1(int data[]) { for(int i = 0; i < MAXSIZE-1; i++) for(int j = i+1; j < MAXSIZE ; j++) if(data[j] < data[i]) swap(data,i,j); } /* * 功能:改进冒泡排序 * 输入:数组 * 输出:无 * 算法:改进后的算法除了关注当前最小值外,还能够顺便移动其它较小值在前面 */ void bubble2(int data[]) { int flag = 1; // 标志位 for(int i = 0; i < MAXSIZE-1 && flag; i++) { flag = 0; // 每次循环标志位都赋为0 for(int j = MAXSIZE - 1; j > i; j--) if(data[j] < data[j-1]) // 相邻两个元素之前的比較,而不是上面的算法仅仅关注最小值。 { swap(data,j-1,j); flag = 1; // 当有发生移动时。才赋为1,否则排序已经完毕。无需多余的比較。 } } } /* * 功能:简单选择排序 * 输入:数组 * 输出:无 * 算法:比較记录最小值的下标。最后才移动。而非每次都比較后就移动 */ void simple(int data[]) { int min = 0; for(int i = 0; i < MAXSIZE-1; i++) { min = i; // 假设第一个下标为最小值 for(int j = i+1; j < MAXSIZE; j++) { if(data[j] < data[min]) // 当出现比第一个下标小的数据,记录其下标 min = j; } if(min != i) // 假设最小值不是第一个下标才交换 swap(data,min,i); } } /* * 功能:直接插入排序 * 输入:数组 * 输出:无 * 算法:将数据插入到已经排好序的有序表中,得到记录增1的有序表。 */ void insertSort(int data[]) { for(int i = 2; i < MAXSIZE; i++) // 第一次循环,排序为data[1],data[2]两个元素,data[0]是哨兵作用 { if(data[i] < data[i-1]) // 假设data[2]比data[1]小。哨兵data[0]设为data[2] { data[0] = data[i]; int j = i; while(data[j-1] > data[0]) // 当data[1] > data[0]时,将其右移即data[2] = data[1] { data[j] = data[j-1]; j--; } data[j] = data[0]; // data[1] = data[0],实现了data[1]和data[2]的交换, // 此时data[1]和data[2]即为排好序的有序表,開始第二次循环 } } } void print(int *data) { for(int i = 0; i < MAXSIZE; i++) printf("%d ",data[i]); printf("\n"); } int main(int argc, char* argv[]) { print(data); // bubble1(data); // bubble2(data); // simple(data); insertSort(data); print(data); }
小结:三种简单排序算法的时间复杂性都是O(n^2),都是稳定的排序。
相关文章推荐
- 每天一个数据结构——三种简单排序算法及Java实现
- 三种简单排序算法及其对比
- 数据结构和算法-----三种简单的排序详解
- 三种简单排序算法及实现(引用)
- 数据结构与算法——三种基础排序算法C#实现(冒泡排序、选择排序、插入排序)
- 算法与数据结构——排序(四)简单插入排序
- 白话经典算法系列之二 直接插入排序的三种实现
- 白话经典算法系列之二 直接插入排序的三种实现
- 简单排序算法--冒泡排序
- 简单排序算法实现——希尔排序
- 归并排序的简单算法
- 简单选择排序的算法实现
- 简单算法(直接插入排序)
- 三种简单排序的对比与分析(未完待续)
- 实现一个简单的c++ list容器(含sort排序 链表归并算法实现)
- 白话经典算法系列之二 直接插入排序的三种实现
- 白话经典算法系列之二 直接插入排序的三种实现
- 数据结构学习笔记一:简单排序与查询算法
- 白话经典算法系列之二 直接插入排序的三种实现
- 转载:yangsen600的C语言实现的简单排序算法汇总