一般的に使用される並べ替えアルゴリズムとその複雑さ(コードレコードの確認)

6つのソートアルゴリズム(関数形式とテスト)

(1)バブルソート
(2)選択ソート
(3)挿入ソート
(4)マージソート
(5)クイックソート(非ランダム/ランダム)
(6)ヒルソート

#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;
}

ソートアルゴリズムの複雑さ

ここに写真の説明を挿入
この記事はレビューコードを記録するだけです

おすすめ

転載: blog.csdn.net/qq_41782149/article/details/107301332
おすすめ