Some commonly used sorting algorithms and their complexity (review code records)

Six sorting algorithms (function form and test)

(1) Bubble sort
(2) Selection sort
(3) Insertion sort
(4) Merge sort
(5) Quick sort (non-random/random)
(6) Hill sort

#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

//冒泡排序
void BubbleSort(int arr[],int length)
{
    
    
    for(int i = 0; i < length; i++)
    {
    
    
        for(int j = 0; j < length - i - 1; j++)
        {
    
    
            if(arr[j] > arr[j+1])
            {
    
    
                int tmp;
                tmp = arr[j+1];
                arr[j+1] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}

//选择排序
void SelecrionSort(int arr[],int length)
{
    
    
    for(int i = 0 ; i < length; i++)
    {
    
    
        int index = i;
        for(int j = i+1; j < length; j++)
        {
    
    
            if(arr[j] < arr[index])
            {
    
    
                index = j;
            }
        }
        if(index == i)
            continue;
        else
        {
    
    
            int tmp;
            tmp = arr[index];
            arr[index] = arr[i];
            arr[i] = tmp;
        }
    }
}

//插入排序
void InsertSort(int arr[],int length)
{
    
    
    int tmp; //定义一个临时变量,用于交换数据时存储
    for(int i = 1; i < length; i++)  //遍历
    {
    
    
        for(int j = 0; j < i; j++)   //第二层循环主要用于对已排好序的序列进行扫描,和要插入进来的数据进行逐一比较,然后决定插入到哪里
        {
    
    
            if(arr[j] > arr[i])
            {
    
    
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}

//分组归并
void _Merge(int *a, int begin1, int end1, int begin2, int end2, int *tmp)
{
    
    
	int index = begin1;
	int i = begin1, j = begin2;
	//注意:当划分的区间足够小时,begin1==end1,begin2==end2
	while (i <= end1 && j <= end2)
    {
    
    
		if (a[i] <= a[j])
			tmp[index++] = a[i++];
		else
			tmp[index++] = a[j++];
	}
	//将左边元素填充到tmp中
	while (i <= end1)
		tmp[index++] = a[i++];
	//将右边元素填充的tmp中
	while (j <= end2)
		tmp[index++] = a[j++];
	//将tmp中的数据拷贝到原数组对应的序列区间
	//注意:end2-begin1+1
	memcpy(a + begin1, tmp + begin1, sizeof(int)*(end2 - begin1 + 1));
}
//归并排序
void MergeSort(int *a, int left, int right, int *tmp)
{
    
    
	if (left >= right)
		return;
	assert(a);
	//mid将数组二分
	int mid = left + ((right - left) >> 1);
	//左边归并排序,使得左子序列有序
	MergeSort(a, left, mid, tmp);
	//右边归并排序,使得右子序列有序
	MergeSort(a, mid + 1, right, tmp);
	//将两个有序子数组合并
	_Merge(a, left, mid, mid + 1, right, tmp);
}

//快速排序 -- 分区(非随机)
int Partition(int *arr,int length,int start,int end)
{
    
    
    if(NULL == arr || length <= 0 || start < 0 || end <= 0 || end > length)
        return -1;
    int baseVal = arr[start];
    int m_start = start;
    int m_end = end;
    while(m_start < m_end)
    {
    
    
        while(m_start < m_end && arr[m_end] > baseVal) //从右向左找比基准数小的数,至少有个是等于的
            --m_end;
        if(m_start < m_end)
        {
    
    
            arr[m_start] = arr[m_end];
            ++m_start;
        }
        while(m_start < m_end && arr[m_start] < baseVal) //从左向右找比基准数大的数
            ++m_start;

        if(m_start < m_end)
        {
    
    
            arr[m_end] = arr[m_start];
            --m_end;
        }
    }
    arr[m_start] = baseVal; //把基准数放到i的位置
    return m_start;
}

//快速排序 -- 分区(非随机/随机)
void Swap(int *a,int *b)
{
    
    
    int temp = *a;
    *a = *b;
    *b = temp;
}

int PartitionRam(int *arr,int length,int start,int end)
{
    
    
    if(NULL == arr || length <= 0 || start < 0 || end <= 0 || end > length)
        return -1;
    int random = rand()%(end-start+1) + start;
    int small = start - 1;

    Swap(&arr[random],&arr[end]);
    for(int i = start; i < end; ++i)  //非随机快排和随机快排的循环是不一样的
    {
    
    
        if(arr[i] < arr[end])
        {
    
    
            ++small;
            if(i != small)
            {
    
    
                Swap(&arr[small],&arr[i]);
            }
        }
    }
    ++small;
    Swap(&arr[small],&arr[end]);
    return small;
}

//快速排序
void QuickSort(int *arr,int length,int start,int end)
{
    
    
    if(start == end)
        return ;
    int index = PartitionRam(arr,length,start,end);
    if(index > start)
        QuickSort(arr,length,start,index-1);
    if(index < end)
        QuickSort(arr,length,index+1,end);
}

//希尔排序
void ShellSort(int arr[],int length)
{
    
    
    int increasement = length;
    int i,j,k;
    do
    {
    
    
        //确定分组增量
        increasement = increasement/3 + 1;
        for(i = 0; i < increasement; i++)
        {
    
    
            for(j = i+increasement; j < length; j+=increasement)
            {
    
    
                if(arr[j] < arr[j-increasement])
                {
    
    
                    int temp = arr[j];
                    for(k = j - increasement; k>=0 && temp<arr[k];k -= increasement)
                    {
    
    
                        arr[k+increasement] = arr[k];
                    }
                    arr[k+increasement] = temp;
                }
            }
        }
    }while(increasement > 1);
}

int main()
{
    
    
    int arr[10] = {
    
    9,3,8,1,0,5,7,6,2,4};

    printf("冒泡排序:\n");
    BubbleSort(arr,10);
    for(int i = 0; i < 10; i++)
    {
    
    
        printf("%d,",arr[i]);
    }
    printf("\n");

    printf("选择排序:\n");
    int arr1[10] = {
    
    9,3,8,1,0,5,7,6,2,4};
    SelecrionSort(arr1,10);
    for(int i = 0; i < 10; i++)
    {
    
    
        printf("%d,",arr1[i]);
    }
    printf("\n");

    printf("插入排序:\n");
    int arr2[10] = {
    
    9,3,8,1,0,5,7,6,2,4};
    InsertSort(arr2,10);
    for(int i = 0; i < 10; i++)
    {
    
    
        printf("%d,",arr2[i]);
    }
    printf("\n");

    printf("归并排序:\n");
    int arr3[10] = {
    
    9,3,8,1,0,5,7,6,2,4};
    int *tmp = (int *)malloc(sizeof(int)*(sizeof(arr3) / sizeof(int)));
	memset(tmp, -1, sizeof(arr3) / sizeof(int));
    MergeSort(arr3, 0, sizeof(arr3) / sizeof(int)-1, tmp);
    for(int i = 0; i < 10; i++)
    {
    
    
        printf("%d,",arr3[i]);
    }
    free(tmp);
    printf("\n");


    printf("快速排序:\n");
    int arr4[10] = {
    
    9,3,8,1,0,5,7,6,2,4};
    QuickSort(arr4,sizeof(arr4)/sizeof(int),0,sizeof(arr4)/sizeof(int)-1);
    for(int i = 0; i < 10; i++)
    {
    
    
        printf("%d,",arr4[i]);
    }
    printf("\n");

    printf("希尔排序:\n");
    int arr5[10] = {
    
    9,3,8,1,0,5,7,6,2,4};
    ShellSort(arr5,sizeof(arr5)/sizeof(int));
    for(int i = 0; i < 10; i++)
    {
    
    
        printf("%d,",arr5[i]);
    }
    printf("\n");

    return 0;
}

The complexity of the sorting algorithm

Insert picture description here
This article is just to record the review code

Guess you like

Origin blog.csdn.net/qq_41782149/article/details/107301332