排序-C语言版

2019-07-10  本文已影响0人  Elijah_cs
  1. 冒泡排序
#include<stdio.h>
void bubble_Sort(int data[],int len)
{
    int i,j,temp;
    for(j=0;j<len-1;j++) //排序len个数据,需要经过len-1此循环,因为排序好len-1个后,最后一个就在他该在的位置
    {
        for(i=0;i<len-j-1;i++) // 每次排序会把当前最大值固定到一个位置,所以每次排序时比较的部分不一样,当第一次排序j=0时,i=0-8,比较了整个数组
        {
            if(data[i]>data[i+1])//比较大小,大的往后
            {
                temp = data[i];
                data[i] = data[i+1];
                data[i+1] = temp;
            }
        }
    }
    return ;
}
int main()
{
    int data[10] = {2,4,7,1,9,3,6,5,8,0};
    int i =0;
    for(i=0;i<10;i++)
    {
        printf("%d ",data[i]);
    }
    bubble_Sort(data,10);
    printf("\n");
    for(i=0;i<10;i++)
    {
        printf("%d ",data[i]);
    }
    printf("\n");
    return 0;
}
  1. 选择排序
#include<stdio.h>
void selection_Sort(int data[],int size)
{
    int i,j,max;
    int max_index;
    int pos;
    for(pos = 0;pos<size-1;pos++) //每次找出极值放入到下标pos的位置
    {
        max = data[pos];
        for(i = pos+1;i<size;i++)  //pos之前的已经排好序了,所以从pos后开始遍历寻找机值
        {
            if(data[i] < max)
            {
                max = data[i];
                max_index = i;  //找到极值的下标
            }
        }
        //交换值
        data[max_index] = data[pos];
        data[pos] = max;
    }
}
int main()
{
    int data[10] = {2,4,7,1,9,3,6,5,8,0};
    int i =0;
    for(i=0;i<10;i++)
    {
        printf("%d ",data[i]);
    }
    selection_Sort(data,10);
    printf("\n");
    for(i=0;i<10;i++)
    {
        printf("%d ",data[i]);
    }
    printf("\n");
    return 0;
}
  1. 插入排序
#include<stdio.h>
void insert_Sort(int data[],int size)
{
    int i,j;
    int pos;
    int temp;
    int flag;
    for(i=1;i<size;i++)  //找到当前位置为i应该插入的位置,此时i=1,那么与data[0]比较即可,当i=2,需要与data[0,1]比较找到位置
    {
        flag = 0;
        pos = 0;
        for(j=0;j<i;j++)
        {
            if(data[j]>data[i]) //找到第一个大于的位置,即是我们需要插入的位置
            {
                pos = j;
                flag = 1;
                break;
            }
        }
        if(flag)
        {
            temp = data[i];
            //把a[pos- i-1]移动一位到a[pos+1 - i],把data[i]复制到data[pos]
            for(j=i-1;j>=pos;j--)
                data[j+1] = data[j];
            data[pos] = temp;
        }
    }
}
int main()
{
    int data[10] = {2,4,7,1,9,3,6,5,8,0};
    int i =0;
    for(i=0;i<10;i++)
    {
        printf("%d ",data[i]);
    }
    insert_Sort(data,10);
    printf("\n");
    for(i=0;i<10;i++)
    {
        printf("%d ",data[i]);
    }
    printf("\n");
    return 0;
}
//
更为简单的实现
void insertion_sort(int arr[], int len){
    int i,j,temp;
    for (i=1;i<len;i++){
            temp = arr[i];
//从后往前遍历,不符合的时候直接把数据向后移动一个位置,直到找到第一个符合的值,
            for (j=i;j>0 && arr[j-1]>temp;j--) //当前的j-1大于temp,那么往后移动
          //循环结束的条件为j=0或者arr[j-1]<=temp,那么可知arr[j]>temp的,所以temp插入的位置为j,又可知在之前的遍历中arr[j]已经移动到前一个了,所以后续直接赋值即可
                    arr[j] = arr[j-1];
            arr[j] = temp;
    }
}
  1. 希尔排序
#include<stdio.h>
void insert_Sort(int data[],int size)
{
    int i,j,temp;
    for(i=1;i<size;i++)
    {
        temp = data[i];
        for(j=i;j>0&&data[j-1]>temp;j--)
            data[j] = data[j-1];
        data[j] = temp;
    }
}
void shell_sort(int arr[], int len) {
    int gap, i, j;
    int temp;
    for (gap = len >> 1; gap > 0; gap = gap >> 1) //gap一开始为size的一般,结束条件为gap=1排序完成后即gap=1>>2=0
        for (i = gap; i < len; i++) {//因为现在是以gap为间隔划分为多组,那么每组的开头默认为有序,即data[0 - gap-1],所以从gap开始判断其插入的位置
            temp = arr[i];
            for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap) //先拿data[i-gap]与data[i]比较,再拿data[i-gap-gap]和data[i]比较,直到找到应该插入的位置,边比较边移动位置,可以看到之前插入排序的gap=1现在的gap可变
                arr[j + gap] = arr[j];
            arr[j + gap] = temp;
        }
}
int main()
{
    int data[10] = {2,4,7,1,9,3,6,5,8,0};
    int i =0;
    for(i=0;i<10;i++)
    {
        printf("%d ",data[i]);
    >}
    insert_Sort(data,10);
    printf("\n");
    for(i=0;i<10;i++)
    {
        printf("%d ",data[i]);
    }
    printf("\n");
    return 0;
}
  1. 归并排序
    把一个数组分为两部分p1,p2,然后把这两部分又划分为两部分p11,p12,p21,p22,一直这样划分直到有序,然后再合并有序的部分形成一个整体,例如当p21,p22有序,那么合并排序后得到有序的p2,同理也可以获得有序的p1,然后合并p1,p2并排序即可得到有序的序列。归并排序实际上是一个划分与合并的过程。
void merge_sort_recursive(int arr[], int reg[], int start, int end) {
  //递归结束条件是start>=end,说明当start=end时,就是划分到最底层,每一个元素为一组,为有序序列
    if (start >= end)
        return;
    int len = end - start, mid = (len >> 1) + start;
    int start1 = start, end1 = mid;
    int start2 = mid + 1, end2 = end;
//要把start到end排好序,先排序start1,end1和start2,end2
    merge_sort_recursive(arr, reg, start1, end1);//递归调用函数
    merge_sort_recursive(arr, reg, start2, end2);
    int k = start;
    while (start1 <= end1 && start2 <= end2) //start1-end1和start-end2都还没有排好序,每次选择一个较小的放入大reg数组去,直到其中一个完全插入到reg数组
        reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
//把剩下未插入到reg数组的插入进去,这两个while只有一个会执行,因为其中一个已经不满足条件了
    while (start1 <= end1)
        reg[k++] = arr[start1++];
    while (start2 <= end2)
        reg[k++] = arr[start2++];
    for (k = start; k <= end; k++)
        arr[k] = reg[k];
}
void merge_sort(int arr[], const int len) {
    int reg[len];
    merge_sort_recursive(arr, reg, 0, len - 1);
}
  1. 快速排序
  1. 堆排序
上一篇 下一篇

猜你喜欢

热点阅读