六种排序方法的学习(直接插入、希尔、冒泡、快速、选择、归并)

来源:互联网 发布:简单画平面图软件 编辑:程序博客网 时间: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
原创粉丝点击