六种排序方法的学习(直接插入、希尔、冒泡、快速、选择、归并)
来源:互联网 发布:简单画平面图软件 编辑:程序博客网 时间:2024/05/29 11:02
1.直接插入排序
#include "stdafx.h"#include "stdio.h"void insort(int s[], int n){ int i,j; for (i = 2; i <= n; i++){ s[0] = s[i]; j = i - 1; while (s[0] < s[j]){ s[j + 1] = s[j]; j--; } s[j + 1] = s[0]; }}void main(){ int a[11], i; printf("请输入10个数据:\n"); for (i = 1; i < 11; i++) scanf_s("%d", &a[i]); printf("原始数据顺序为:\n"); for (i = 1; i < 11; i++) printf("%5d", a[i]); insort(a, 10); printf("\n插入数据排序后的顺序为\n"); for (i = 1; i < 11; i++) printf("%5d", a[i]); printf("\n");}
2.希尔排序
#include<stdio.h>void shsort(int s[], int n){ int i, j, d; d = n / 2; while(d >= 1){ for(i = d + 1; i <= n; i++){ s[0] = s[i]; j = i - d; while((j>0) && (s[0]<s[j])){ s[j + d] = s[j]; j = j - d } s[j + d] = s[0]; } d = d / 2; }}void main(){ int a[11]; printf("请输入10个数据:\n"); for(i = 1; ii <= 10; i++) scanf_s("%d",&a[i]); shshort(a, 10); printf("排序后的顺序是:\n"); for (i = 0; i <= 10; i++) printf("%5d", a[i]); printf("\n");}
3.冒泡排序
冒泡排序相对较简单,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
#include<stdio.h>void main(){ int i, j, a[11]; printf("请输入10个数字\n"); for (i = 1; i < 11; i++) scanf("%d", &a[i]); for (i = 1; i < 10;i++) for (j = 1; j < 10 - i;j++) if a[j]>a[j+1]{ int t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } printf("排序后的顺序为:\n"); for (i = 1; i <= 10; i++) printf("%5d", a[i]);}
4.快速排序
快速排序方法效率较高,为O(NlogN),并且快速排序的思想为–分治法,在找工作面试时经常会被提及。
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
在看过很多算法讲解的文章后,觉得干巴巴的理解是很难能掌握算法的本质,并且也不能促进在考场中写出代码的,忽然有一种很生动形象的说法吸引到我,我就来简单的说一下—挖坑填数+分治法。
举例说明:现有十组数据需要重新排序,a[10]={23,43,2,5,1,87,53,90,76,68}.
首先取最开始的一个数为基准数,即令i=1,j=10,k=23.
(需添加)
# include<stdio.h>void qusort(int s[], int start, int end){ int i, j; i = start; j = end; s[0] = s[start]; while (i < j){ while (i < j && s[0] < s[j]) j--; while (i < j && s[0] >= s[0]) i++; if (i < j){ s[j] = s[i]; j--; } } s[i] = s[0]; if (start < i) qusort(s, start, j - 1); if (i < end) qusort(s, j + 1, end);}void main(){ int a[11], i; printf("请输入10个数据\n"); for (i = 1; i < 11;i++) scanf("%d", &a[i]); qusort(a, 1, 10); printf("排序之后的数据为:"); for (i = 1; i <= 10; i++) printf("%5d", a[i]); printf("\n");}
5.选择排序法
#include<stdio.h>void main(){ int i, j, a[11]; /*定义变量及数组为基本整型*/ printf("请输入10个数:\n"); for (i = 0; i < 11; i++) scanf("%d", &a[i]); /*从键盘中输入要排序的10个数字*/ for (i = 0; i <= 9;i++) for (j = i + 1; j <= 10; j++) if (a[i]>a[j])/* 如果前一个数比后一个数大,则利用中间变量t事先两值互换 */ { t = a[i]; a[i] = a[j]; a[j] = t; } printf("排序后的顺序是:\n"); for (i = 0; i <= 10; i++) printf("%5d", a[i]); /*输出排序后的数组*/ printf("\n");}
6.归并排序法
归并是将两个或者多个有序记录合并成一个有序序列。归并方法有多种,一次对两个有序记录序列进行归并,称为二路归排序,也有三路归并排序及多路归并排序。本实例是二路归并排序,基本方法如下:
(1)将n个记录看成是n个长度为1的有序表;
(2)将两两相邻的有序子表进行归并;
(3)重复执行步骤二,直达归并成一个长度为n的有序表。
0 0
- 六种排序方法的学习(直接插入、希尔、冒泡、快速、选择、归并)
- 六、内部排序综合(九种)—插入类排序(直接插入、折半插入、希尔排序);交换类排序(冒泡、快速);选择类排序(简单选择、堆排序);二路归并排序;基数排序
- 常见排序集合(冒泡排序,选择排序,直接插入排序,二分插入排序,快速排序,希尔排序,归并排序)
- 插入 | 希尔 | 冒泡 | 快速 | 选择 | 归并排序
- 冒泡排序 快速排序 选择排序 堆排序 直接插入排序 希尔排序 归并排序
- 冒泡、选择、快速、插入、希尔、归并排序算法的小结
- 八种排序算法(直接插入,希尔,直接选择,堆,冒泡,快排,归并,基数)
- 数据结构与算法:七种排序算法总结(冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序、快速排序)
- 排序算法: 冒泡排序, 快速排序,希尔排序,直接插入排序 ,直接选择排序,归并排序,堆排序
- 六种排序 冒泡 选择 插入 归并 快速 堆排序
- 常用的排序算法:插入排序,希尔排序,冒泡排序,选择排序,快速排序,归并排序
- 比较排序总结——直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序
- 数据结构排序,冒泡,快速,直接选择,直接插入,希尔
- python(三)6种排序算法性能比较(冒泡、选择、插入、希尔、快速、归并)
- 10种排序算法总结(冒泡、选择、插入、希尔、归并、快速、堆、拓扑、锦标赛、基数)
- 十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)
- 七种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速)
- 十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)
- 面向机器学习专家的 MNIST 高级教程代码
- 【GDSOI2017第三轮模拟】Informatics Training(码农,平衡树)
- python文件和目录操作方法大全
- Linux (常用命令2)
- 指令与动作之include指令
- 六种排序方法的学习(直接插入、希尔、冒泡、快速、选择、归并)
- 《C和指针》——字符串常量实际上是个指针,你真的懂了么?
- 机器学习笔记5——朴素贝叶斯算法
- 斐波那契数列几道题目
- JAVA创建文件||文件夹标准流程
- ubuntu14.04 安装opencv
- 在VMWare上安装ubuntu 16.04
- linux_基础概念
- 如何解压deb格式文件