排序算法

来源:互联网 发布:2016人工智能论坛 编辑:程序博客网 时间:2024/06/05 22:45

一、插入排序-直接插入排序

1.描述:
直接插入排序,指每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
2.基本思想:
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
直接插入排序的示例
要点:设立哨兵,作为临时存储和判断数组边界之用
3.源代码:

#include<stdio.h>#include<stdlib.h>int main(){    int a[] = { 98, 76, 109, 34, 67, 190, 80, 12, 14, 89, 1 };    int k = sizeof(a) / sizeof(a[0]);    int i = 0;    int j = 0;    for (i = 1; i < k; i++)//循环从第2个元素开始    {        if (a[i]<a[i - 1])        {            int temp = a[i];            for (j = i - 1; j >= 0 && a[j]>temp; j--)            {                a[j + 1] = a[j];            }            a[j + 1] = temp;//此处就是a[j+1]=temp;        }    }    for (i = 0; i < k; i++)    {        printf("%d ", a[i]);    }    system("Pause");    return 0;}

二、选择排序-简单选择排序
1.描述:
每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止。
2.基本思想:
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

简单选择排序的示例
3.源代码:

#include<stdio.h>#include<stdlib.h>int main(){    int i = 0;    int j = 0;    int a[] = { 9, 1, 2, 5, 7, 4, 8, 6, 3, 5 };    int sz = sizeof(a) / sizeof(a[0]);    for (i = 0; i < sz - 1; i++)    {        int temp = 0;        int index = i;        for (j = i + 1; j < sz; j++)        {            if (a[index] > a[j])            {                index = j;            }        }        temp = a[index];        a[index] = a[i];        a[i] = temp;    }    for (i = 0; i < sz; i++)    {        printf("%d ", a[i]);    }    printf("\n");    system("Pause");    return 0;}

三、交换排序-冒泡排序
1.描述:
重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
2.基本思想:
每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
冒泡排序的示例
3.源代码:

#include<stdio.h>#include<stdlib.h>int main(){    int i = 0;    int j = 0;    int temp = 0;    int a[] = { 49, 38, 65, 97, 76, 13, 27 };    int sz = sizeof(a) / sizeof(a[0]) - 1;      for (j = 0; j <= sz ; j++)    {        for (i = 0; i < sz - j; i++)            if (a[i]>a[i + 1])            {                temp = a[i];                a[i] = a[i + 1];                a[i + 1] = temp;            }    }    for (i = 0; i < sz + 1; i++)        printf("%d ", a[i]);    printf("\n");    system("Pause");    return 0;}

四、交换排序-快速排序
1.描述:
快速排序是对冒泡排序的一种改进,采用一种分治的策略。
2.基本思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
一趟排序的过程
排序全过程
3.源代码:

int quicksort(vector<int> &v, int left, int right){    if (left < right)    {        int key = v[left];        int low = left;        int high = right;        while (low < high)        {            while (low < high && v[high] > key)            {                high--;            }            if (low < high)                v[low++] = v[high];            while (low < high && v[low] < key)            {                low++;            }            if (low < high)                v[high--] = v[low];        }        v[low] = key;        quicksort(v, left, low - 1);        quicksort(v, low + 1, right);    }}
原创粉丝点击