算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
每次开始动手写算法,都是先把插入排序,冒泡排序写一遍,十次有九次是重复的,所以这次下定决心,将所有常规的排序算法写了一遍,以便日后熟悉。
以下代码总用一个main函数和一个自定义的CommonFunction函数
CommonFunction函数中定义了一个交换函数和一个输出函数:
- /*
- * CommonFunction.h
- *
- * Created on: 2015年11月16日
- * Author: hoojjack
- */
- #pragma once
- namespace section4 {
- void swap(int *first, int *second) {
- int temp;
- temp = *first;
- *first = *second;
- *second = temp;
- }
- void printfByStep(int *a, int i, int len) {
- int k;
- printf("The result of the %dth step\n", i);
- for (k = ; k < len; k++)
- printf("%d ", a[k]);
- printf("\n");
- }
- }
main函数:
- /*
- * SortMain.cpp
- *
- * Created on: 2015年11月16日
- * Author: hoojjack
- */
- #include<stdio.h>
- #include<stdlib.h>
- #include<time.h>
- #include<sys/timeb.h>
- #include "BubbleSort.h"
- #include "SelectionSort.h"
- #include "InsertionSort.h"
- #include "ShellSort.h"
- #include "QuickSort.h"
- #include "CommonFunction.h"
- #include "HeapSort.h"
- #include "MergeSort.h"
- #define SIZE 10
- int main() {
- int array[SIZE], i, options;
- srand(time(NULL));
- for (i = ; i < SIZE; i++) {
- array[i] = rand() / + ;
- }
- printf("The array of original sorting\n");
- for (i = ; i < SIZE; i++) {
- printf("%d ", array[i]);
- }
- printf("\nPlease choose your options:\n 1:BubbleSort\t 2:Selection\t ");
- printf(
- "3:InsertSort\t 4:ShellSort\t 5:QuickSort\t 6:HeapSort\t 7:MergeSort\t\n");
- // scanf("%d", &options);
- for (i = ; i <= ; i++) {
- options=i;
- switch (options) {
- case :
- printf("The result of Bubble sorting is following:\n");
- section4::bubbleSort(array, SIZE);
- break;
- case :
- printf("The result of Selection sorting is following:\n");
- section4::selectionSort(array, SIZE);
- break;
- case :
- printf("The result of Insertion sorting is following:\n");
- section4::insertionSort(array, SIZE);
- break;
- case :
- printf("The result of Shell sorting is following:\n");
- section4::shellSort(array, SIZE);
- break;
- case :
- printf("The result of Quick sorting is following:\n");
- section4::quickSort(array, , SIZE - );
- section4::printfByStep(array, SIZE, SIZE);
- break;
- case :
- printf("The result of Heap sorting is following:\n");
- section4::heapSort(array, SIZE);
- break;
- case :
- printf("The result of Merge sorting is following:\n");
- section4::mergeSort(array, SIZE);
- break;
- }
- }
- // for (i = 0; i < SIZE; i++) {
- // printf("%d ", array[i]);
- // }
- // printf("\n");
- return ;
- }
1、冒泡排序:
- /*
- * BubbleSort.h
- *
- * Created on: 2015年11月16日
- * Author: hoojjack
- */
- #pragma once
- #include "CommonFunction.h"
- namespace section4 {
- /*
- * 冒泡排序,很简单,相邻的两个元素进行比较,将较大的元素往后挪
- * 每进行一次循环,排好一个元素
- */
- void bubbleSort(int *a, int len) {
- int i, j;
- for (i = ; i < len; i++) {
- for (j = ; j < len - i; j++) {
- if (a[j] > a[j + ]) {
- swap(&a[j],&a[j+]);
- }
- }
- //The result of the %dth step
- //section4::printfByStep(a,i,len);
- }
- section4::printfByStep(a,i,len);
- }
- }
2、选择排序算法:
- /*
- * SelectionSort.h
- *
- * Created on: 2015年11月16日
- * Author: hoojjack
- */
- #pragma once
- #include "CommonFunction.h"
- namespace section4 {
- /*
- * @author
- * 选择排序,每第i次循环为第i个位置找到此序列相应的第i个数。
- */
- void selectionSort(int *a,int len){
- int i,j,k;
- for(i=;i<len;i++){
- k=i;//记录此刻要数组中待排的位置
- for(j=i;j<len;j++){
- if(a[k]>a[j])
- k=j;
- }
- if(k!=i){
- section4::swap(&a[k],&a[i]);
- }
- //section4::printfByStep(a,i,len);
- }
- section4::printfByStep(a,i,len);
- }
- }
3、插入排序算法:
- /*
- * InsertionSort.h
- *
- * Created on: 2015年11月16日
- * Author: hoojjack
- */
- #pragma once
- #include "CommonFunction.h"
- namespace section4{
- /*
- * 此处的插入排序没有安排哨兵,即没有将a[0]空出来
- */
- void insertionSort(int *a,int len){
- int i,temp,j;
- for(i=;i<len;i++){
- temp=a[i];
- j=i-;
- while(j>=&&temp<a[j]){
- a[j+]=a[j];
- j--;
- }
- a[j+]=temp;
- // section4::printfByStep(a,i,len);
- }
- section4::printfByStep(a,i,len);
- }
- }
4、希尔排序算法:
- /*
- * ShellSort.h
- *
- * Created on: 2015年11月16日
- * Author: hoojjack
- */
- #pragma once
- #include "CommonFunction.h"
- namespace section4 {
- /*
- * 希尔排序的思路是:每次以i/2的大小进行插入排序,第一次是以len/2的长度进行比较
- * i为相隔的步长,每次以i的步长往前进行比较,直到步长为1。
- *
- */
- void shellSort(int *a, int len) {
- int i, j, temp,k, x = ;
- for (i = len / ; i >= ; i = i / ) {
- for (j = i; j < len; j++) {
- temp = a[j];
- k = j - i;
- while (temp < a[k] && k >= ) {
- a[k + i] = a[k];
- k = k - i;
- }
- a[k + i] = temp;
- }
- x++;
- //section4::printfByStep(a, x, len);
- }
- section4::printfByStep(a, x, len);
- }
- }
5、快速排序算法:
- /*
- * QuickSort.h
- *
- * Created on: 2015年11月16日
- * Author: hoojjack
- */
- #pragma once
- #include "CommonFunction.h"
- namespace section4 {
- /*@author
- * 快速排序:这是自己按照快速排序的思路写的,刚开始出现两个地方的错误
- * 1、递归循环的时候没有判断(left < low - 1)和(high + 1 < right)导致递归的时候
- * 出现left值比right值大,以致递归不能结束
- *
- * 2、temp <= a[high] 没有判断=号,导致如果数组里出现相同的数字时,low和high的位置没有变化
- * 导致循环不断地在交换a[low]和a[high]的值,出现死循环。
- *
- */
- void quickSort(int *a, int left, int right) {
- int low, high, temp;
- low = left;
- high = right;
- temp = a[low];
- while (low < high) {
- while (temp <= a[high] && low < high) {
- high--;
- }
- a[low] = a[high];
- while (temp >= a[low] && low < high) {
- low++;
- }
- a[high] = a[low];
- }
- a[low] = temp;
- // printf("low=%d,high=%d\n", low, high);
- if (left < low - )
- quickSort(a, left, low - );
- if (high + < right)
- quickSort(a, high + , right);
- }
- }
6堆排序算法:
- /*
- * HeapSort.h
- *
- * Created on: 2015年11月17日
- * Author: hoojjack
- */
- #pragma once
- #include "CommonFunction.h"
- namespace section4 {
- /*
- * @author
- * 堆排序应该注意的几点:
- * 1、首先从最后一个父节点开始往上堆排序,在计算的时候考虑数组下标,计算
- * 最后一个父节点的计算公式是len/2-1(因为数组从0开始编号),然而在算它的孩子几点时
- * 左孩子节点不再是2*parent,而是2*parent+1;
- * 2、对数组进行从小到大排序,需要建立大根堆,因为数字大的排在数组后面
- */
- void heapSort(int *a, int len) {
- int child, parent, t, i, j, z;
- for (i = ; i < len; i++) {
- z = len - - i;
- for (j = ((z + ) / ) - ; j >= ; j--) {
- parent = j;
- while (( * parent + ) <= z) {
- child = * parent + ;
- if ((child + ) <= z) {
- if (a[child] > a[child + ]) {
- t = child;
- } else {
- t = child + ;
- }
- } else {
- t = child;
- }
- if (a[parent] < a[t]) {
- section4::swap(&a[parent], &a[t]);
- } else {
- break;
- }
- }
- }
- section4::swap(&a[],&a[z]);
- //section4::printfByStep(a,i,len);
- }
- section4::printfByStep(a,i,len);
- }
- }
7、归并排序算法:
- /*
- * MergeSort.h
- *
- * Created on: 2015年11月17日
- * Author: hoojjack
- */
- #pragma once
- #include<stdlib.h>
- #include "CommonFunction.h"
- namespace section4 {
- /*
- * @author
- * 分步归并函数
- *
- */
- void mergeOne(int *a, int *b, int n, int len) {
- int i, j, s, t, e, k;
- s = ;
- while (s < len) {
- i = s;
- t = n + s;
- j = s + n;
- e = s + * n - ;
- k = s;
- /*其中,i代表第一个归并子序列的首位,t代表此序列的末位
- * j代表第二个归并子序列的首位,e代表此序列的末位
- * k代表另一个数组的下标
- * e的大小没有进行判断,容易导致最后一次归并时,
- * 导致下标越界,故一定要判断e是否>=len
- */
- if(e>=len){
- e=len-;
- }
- while (i < t && j <= e) {
- if (a[i] < a[j]) {
- b[k++] = a[i++];
- } else {
- b[k++] = a[j++];
- }
- }
- while (i < t) {
- b[k++] = a[i++];
- }
- while (j <= e) {
- b[k++] = a[j++];
- }
- //s在此刻第二个归并子序列e的基础前进1
- s = e + ;
- }
- // if (s < len) {
- // for (; s < len; s++)
- // b[s] = a[s];
- // }
- }
- /*
- * 归并函数,b为开辟一个新数组的首地址,f为标志符,
- * 当f=1时,将数组a中的数复制到数组b中,否则,进行相反操作
- * s为每次归并的长度,1,2,2^2,2^3,......
- * 直到数组子序列归并为一个,即s<len
- */
- void mergeSort(int *a, int len) {
- int *b;
- int f = , s = , count = , h;
- if (!(b = (int *) malloc(sizeof(int) * len))) {
- printf("内存分配失败\n");
- exit();
- }
- while (s < len) {
- if (f == ) {
- mergeOne(a, b, s, len);
- // section4::printfByStep(b, count++, len);
- } else {
- mergeOne(b, a, s, len);
- // section4::printfByStep(a, count++, len);
- }
- f = - f;
- s = s * ;
- }
- if (!f) {
- for (h = ; h < len; h++)
- a[h] = b[h];
- }
- section4::printfByStep(a, count, len);
- free(b);
- }
- }
最后的结果是:
- The array of original sorting
- Please choose your options:
- :BubbleSort :Selection :InsertSort :ShellSort :QuickSort :HeapSort :MergeSort
- The result of Bubble sorting is following:
- The result of the 10th step
- The result of Selection sorting is following:
- The result of the 10th step
- The result of Insertion sorting is following:
- The result of the 10th step
- The result of Shell sorting is following:
- The result of the 3th step
- The result of Quick sorting is following:
- The result of the 10th step
- The result of Heap sorting is following:
- The result of the 10th step
- The result of Merge sorting is following:
- The result of the 0th step
算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版的更多相关文章
- [Swift]八大排序算法(三):选择排序 和 简单选择排序
排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...
- 排序算法总结(三)选择排序【Select Sort】
一.原理 选择排序的原理非常简单,就是选出最小(大)的数放在第一位,在剩下的数中,选出最小(大)的数,放在第二位......重复上述步骤,直到最后一个数. 二.过程 原始数据 第一次排序,选出最小的数 ...
- 学习Java绝对要懂的,Java编程中最常用的几种排序算法!
今天给大家分享一下Java中几种常见的排序算法的Java代码 推荐一下我的Java学习羊君前616,中959,最后444.把数字串联起来! ,群里有免费的学习视频和项目给大家练手.大神有空时也 ...
- C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()
本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...
- 归并排序 & 计数排序 & 基数排序 & 冒泡排序 & 选择排序 ----> 内部排序性能比较
2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...
- 《算法4》2.1 - 选择排序算法(Selection Sort), Python实现
选择排序算法(Selection Sort)是排序算法的一种初级算法.虽然比较简单,但是基础,理解了有助于后面学习更高深算法,勿以勿小而不为. 排序算法的语言描述: 给定一组物体,根据他们的某种可量化 ...
- python算法(一)基本知识&冒泡排序&选择排序&插入排序
本节内容: 算法基本知识 冒泡排序 选择排序 插入排序 1. 算法基本知识 1.1 什么是算法? 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 ...
- 经典排序算法 – 插入排序Insertion sort
经典排序算法 – 插入排序Insertion sort 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...
- java排序算法(十):桶式排序
java排序算法(十):桶式排序 桶式排序不再是一种基于比较的排序方法,它是一种比较巧妙的排序方式,但这种排序方式需要待排序的序列满足以下两个特征: 待排序列所有的值处于一个可枚举的范围之类: 待排序 ...
随机推荐
- 玩转Linux文件描述符和重定向
本文介绍linux中文件描述符与重定向的相关知识,文件描述符是与文件输入.输出相关联的整数,它们用来跟踪已打开的文件.有需要的朋友参考下. 原文出处:http://www.jbxue.com/arti ...
- Atitit.注册跟个登录功能的实现attilax总结obo
Atitit.注册跟个登录功能的实现attilax总结obo 1. 注册模块 2 1.1. 基本注册功能(用户名方式) 2 1.2. 动态ajax监测用户名重复 2 1.3. 注册手机验证 2 1.4 ...
- 线程相关函数(7)-sem_post(), sem_wait() 信号量
sem_tsem_initsem_waitsem_trywaitsem_timedwaitsem_postsem_destroy 生产者消费者实例: #include <stdlib.h> ...
- hdu 1006 Tick and Tick 有技巧的暴力
Tick and Tick Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- dp之完全背包poj2063
题意:求投资k年获得最大投资,每年都选最大利息的方案进行投资k年后就可以得到最多的人民币. 注意:每一年收到的利息都可以作为下一年的本金......其实从测试数据来看,是很好看出来的...... 思路 ...
- Java得到GET和POST请求URL和参数列表
一 获取URL:getRequestURL() 二 获取参数列表: 1.getQueryString() 只适用于GET,比如客户端发送http://localhost/testServlet?a=b ...
- 软件配置管理中的SVN
一.简单介绍 1.什么是软件配置管理 软件配置管理是指通过运行版本号控制.变更控制的规程.以及使用合适的配置管理软件.来保证全部配置项的完整性和可跟踪性. 配置管理是对工作成果的一种有效保护. 2.为 ...
- C语言 · 复数四则运算
算法提高 6-17复数四则运算 时间限制:1.0s 内存限制:512.0MB 设计复数库,实现基本的复数加减乘除运算. 输入时只需分别键入实部和虚部,以空格分割,两个复数之间用运算符 ...
- android 百度地图开发实例(转载)
因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点androi ...
- 数论 - SGU 105 DIV3
SGU 105-DIV 3 Problem's Link Mean: 定义这样一种数列:1,12,123.. 给出一个n,求这个数列中能被3整除的数的个数. analyse: 这道题可以用分析的方法解 ...