排序学习笔记

来源:互联网 发布:淘宝培训班哪家好 编辑:程序博客网 时间:2024/05/22 06:41

学习资料:

维基百科-排序算法:http://en.wikipedia.org/wiki/Sorting_algorithm

程序员必知8大排序3大查找:http://blog.csdn.net/shan9liang/article/details/7533466


1. 插入排序(Insertion Sort)

实现思路:

1)从第一个元素开始,该元素可以认为已经被排序
2)取出下一个元素,按从后向前(从大到小)的次序,逐一与以排序好的元素比较
3)如果该元素小于比较的元素,将比较的元素后移一位置
4)重复步骤3,直到该元素不小于比较的元素
5)将新元素插入到该位置中
6)重复步骤2~5

//直接插入排序void insertion_sort(int *array, int len){    int i, j;    for(i = 1; i < len; i++)    {        j = i - 1;        while(array[j] > array[i] && j >= 0)        {            array[j+1] = array[j];            j--;        }        array[j+1] = array[i];        //print_array(array, len);    }}

2.希尔排序(Shell sort)

基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。

//希尔排序void shell_sort(int *array, int len){    int gap;    int i, j;    for(gap = len / 2; gap > 0; gap /= 2)    {        for(i = gap; i < len; i++)        {            for(j = i - gap; j >= 0; j -= gap)            {                if(array[j] > array[j+gap])                {                   // swap(&array[j], &array[j+gap]);                    int temp = array[j];                    array[j] = array[j+gap];                    array[j+gap] = temp;                }            }        }        //print_array(array, len);    }}


3.选择排序(Selection sort)

基本思想:首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾(目前已被排序的序列)。以此类推,直到所有元素均排序完毕。

void select_sort(int *array, int len){    int i, j;    int i_min; //最小元素的下标    for(i = 0; i < len; i++)    {        i_min = i;        for(j = i + 1; j <len; j++)        {            if(array[j] < array[i_min])            {                i_min = j;                }        }        if(i_min != i)        {            //swap(&array[i], &array[i_min]);            int temp = array[i_min];            array[i_min] = array[i];            array[i] = temp;        }        //print_array(array, len);    }}


4.冒泡排序(Bubble Sort)

基本思想:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

// 冒泡排序void bubble_sort(int *array, int len){    int i, j;    for(i = len; i > 0; i--)    {        for(j = 1; j < i; j++)        {            if(array[j] < array[j-1])            {                //swap(&array[j], &array[j-1]);                int temp = array[j];                array[j] = array[j-1];                array[j-1] = temp;            }        }        //print_array(array, len);    }}


原创粉丝点击