排序算法原理简述及C语言实现

来源:互联网 发布:全国多少个省市 知乎 编辑:程序博客网 时间:2024/05/17 16:46

=============================== 博客点滴积累,部分话语和知识点来源于网络,感谢网络资源的提供者======
1 冒泡排序
原理简述:冒泡排序,大泡泡在底下,小泡泡在上面,假设递增排序,即小数在前面,大数在后面。每一次比较相邻的两个数,第一个数大于第二个数,就交换顺序,一次比较到数组结尾,最后一个就是最大的数,再一次从头开始比较,比较到倒数第二个数,最后一个数不参与比较,以此一直比较,到没有数据交换为止,此时排序完成。

void bubblesort(int arr[],int len){    int i,j;    int tmp;    for(i = 0; i < len; i ++)    {        for(j = 1; j < len -i; j++)        {            if(arr[j-1] > arr[j])            {                tmp = arr[j];                arr[j] = arr[j-1];                arr[j-1] = tmp;            }        }    }}

2 插入排序
原理简述:插入排序,插入,即向有序的序列先比较再插入,首先假设数组首元素有序,取出第二个元素,与第一个比较,比第一个元素大,就交换顺序,接着取第三个元素,先与第二个元素,比第二个大,位置不动,比第二个小,第二个元素换到第三个元素的位置,再和第一个比较,比第第一个大,就放到第二个元素位置,比第一个元素小,就将一个元素,放到第二个元素的位置,以此类推。

void insertsort(int arr[],int len){    int i,k;    int tmp;    for(i = 1;i < len;i++)    {        tmp = arr[i];        k = i-1;        while((k >=0) && (arr[k] > tmp))        {            arr[k+1] = arr[k];            k--;        }        arr[k+1] = tmp;    }}

3 选择排序
原理简述:选择排序,即在无序的数组中找个最小的放在第一位,接下来,在剩余的数中,再找一个最小的数,放到第二位,以此类推。

void selectsort(int arr[],int len){    int min;    int i,j;    int tmp;    for(i = 0;i < len;i++)    {        min = arr[i];        for(j = i+1; j < len;j++)        {            if(min > arr[j])            {                tmp = min;                min = arr[j];                arr[j] = tmp;            }        }        arr[i] = min;    }}

4 希尔排序
原理简述:希尔排序,实质是分组插入排序,一般情况,假设数据8个元素,先分为(step = n/2)四组,(1,5),(2,6),(3,7),(4,8),组内先比较 ,比较交换后,再分为(step =step /2)两组,(1,3,5,7),(2,4,6,8),组内先比较排序交换,再分为(step =step /2)一组,排序后,就完成排序了,此时step =step/2 = 0。

void shellsort(int arr[],int len){    int step;    int i,k;    int tmp;    for(step = len/2; step > 0; step = step/2)    {        for(i = step; i < len;i++)        {            if(arr[i - step] > arr[i])            {                k = i -step;                tmp = arr[i];                while(k>=0 && arr[k] > tmp)                {                    arr[k+step] = arr[k];                    k = k -step;                }                arr[k+step] = tmp;            }        }    }}

5 快速排序
原理简述:快速排序,先选择一个元素(一般首元素或尾元素),假设是首元素,首先取出首元素缓存,首元素位置为空,定义两个变量low,high,low从最小下标递增,high最大下标递减,第一步,看high下标的这个元素,是否大于首元素缓存,大于则high–,继续判断直到不大于则将这个元素放到首元素的位置,此时,high下标的位置为空,比较low下标元素,小于缓存则low++,,继续判断直到不小于则将这个元素放到high下标元素的位置,此时,low下标的位置为空,以此循环,直到low不小于high为止,此时low位置放首元素的缓存,low位置最终就是这个元素排序的位置,然后以low位置为分界线分为两组,再做如上步骤。

void quicksort(int arr[],int left ,int right){    int low,high;    int key;    key = arr[left];    low = left;    high = right;    if(left < right)    {        while(low < high)        {            while((low < high)  && (key <= arr[high]))            {            high--;            }            arr[low] =arr[high];            while((low < high)  && (key > arr[low]))            {            low++;            }            arr[high] = arr[low];        }        arr[low] = key;        quicksort(arr,left,low-1);        quicksort(arr,low+1,right );    }}

6 归并排序
原理简述:归并排序,先递归后合并,一组数分为两组,两组分为四组,四组分为八组,直到每组只有一个元素,此时认为有序,然后逆向合并,两个一个元素合并两个,两个合并四个,直到合并为一个大数组为止。以下代码来自百度百科。

void Merge(int sourceArr[],int tempArr[],int startIndex,int midIndex,int endIndex){    int i = startIndex,j=midIndex+1,k = startIndex;    while(i!=midIndex+1 && j!=endIndex+1)    {        if(sourceArr[i]>sourceArr[j])            tempArr[k++] = sourceArr[i++];        else            tempArr[k++] = sourceArr[j++];    }    while(i!=midIndex+1)        tempArr[k++] = sourceArr[i++];    while(j!=endIndex+1)        tempArr[k++] = sourceArr[j++];    for(i=startIndex;i<=endIndex;i++)        sourceArr[i] = tempArr[i];}void MergeSort(int sourceArr[],int tempArr[],int startIndex,int endIndex){    int midIndex;    if(startIndex<endIndex)    {        midIndex=(startIndex+endIndex)/2;        MergeSort(sourceArr,tempArr,startIndex,midIndex);        MergeSort(sourceArr,tempArr,midIndex+1,endIndex);        Merge(sourceArr,tempArr,startIndex,midIndex,endIndex);    }}

堆排序比较麻烦一点,需要理解的知识点较多,下次博客再详细写吧。

0 0
原创粉丝点击