冒泡,插入,选择,希尔排序算法

冒泡排序

#include <stdio.h>

/*
    思想:将数组中的数据从小到大排序,这里使用双重for循环,第一个for循环控制从哪里到哪里,第二个for循环是对这个范围内的数据进行逐个比较。
*/
void BubbleSort(int arr[],int len)
{
    
    
    int i,j;
    int temp;

    for(i = len - 1; i > 0; i--)   //从最后一个开始比较,依次类推,每次一轮结束都会有一个数确定了它的位置。
    {
    
    
        for(j = 0; j < i ; j++)    //从0开始逐个比较一直比较到i,这里说比较到i是因为下面有一个j++,其实到i的前一个。
        {
    
    
            if(arr[j] > arr[j+1])  //如果当前值比后一个大则换位置
            {
    
    
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;   
            }
        }
    }
}

int main()
{
    
    
    int array[10] = {
    
    3, 90, 43, 5, 65, 23, 12, 34, 6, 8};
    BubbleSort(array,10);

    for(int i = 0; i < 10; i++)
    {
    
    
        printf("%d  ",array[i]);
    }
    printf("\n");

    return 0;
}

插入排序

#include <stdio.h>

/*
    思想:插入排序是默认第一个数是有序的,然后从第二个数开始与之前的数进行比较,这里需要注意
          是与之前的数进行比较,所以在第一个for循环中,就要与前面的进行比较,一直比较到第一个数,
          但是最后比较到第一个数之后,又进行了j--,这里需要在后面再加上,然后将值赋给这个位置。
*/
void InsertionSort(int *arr,int len)
{
    
    
    int i,j,temp;
    for(i = 1; i < len; i++)
    {
    
    
        if(arr[i] < arr[i-1])
        {
    
    
            temp = arr[i];
        
            for(j = i - 1; j >= 0 && arr[j] > temp; j--)  //j不仅仅要大于等于0,还要大于temp。这个循环就是比较大小然后挪位置的。
            {
    
    
                arr[j+1] = arr[j];
            }
            arr[j+1] = temp; //这步因为上面for循环多执行异步j--,所以这里要j+1。
        }
    }
}

int main()
{
    
    
    int array[10] = {
    
    3, 90, 43, 5, 65, 23, 12, 34, 6, 8};
    InsertionSort(array,10);

    for(int i = 0; i < 10; i++)
    {
    
    
        printf("%d  ",array[i]);
    }
    printf("\n");

    return 0;
}

选择排序

#include <stdio.h>

void SelectionSort(int *arr,int len)
{
    
    
    int i,j,k,temp;
    for(i = 0; i < len - 1; i++)    //从第一个数开始
    {
    
    
        k = i;    //先copy一份位置
        for(j = i + 1; j < len; j++)  //从i后面的数开始比较
        {
    
    
            if(arr[j] < arr[k])     //如果比较的数比arr[k]位置的数据小,就先把j的数据赋值给k,等循环结束,会有一个最小的值得出,后面再和i进行互换。
            {
    
    
                k = j;
            }
        }

        temp = arr[k];
        arr[k] = arr[i];
        arr[i] = temp;

    }
}

int main()
{
    
    
    int array[10] = {
    
    3, 90, 43, 5, 65, 23, 12, 34, 6, 8};
    SelectionSort(array,10);

    for(int i = 0; i < 10; i++)
    {
    
    
        printf("%d  ",array[i]);
    }
    printf("\n");

    return 0;
}

希尔排序

#include <stdio.h>

/*
  
*/
void ShellSort(int *arr,int len)
{
    
    
    int i,j,k,temp,gap;  //gap是步长
	for(gap = len / 2; gap > 0; gap /= 2)   //这里就是按一定步长分开,把这写数据不断拆分,指导拆分为1个个单独的数据
	{
    
    
		for(i = 0; i < gap; i++)       //数据中的第一个数
		{
    
    
			for(j = i + gap; j < len; j += gap)   //拆分之后每组数据的第一个数据
			{
    
    
				temp = arr[j];      //这里就和插入排序类似了,默认第一组第一个数是有序的,这里把这个比较的数先copy一份。
				k = j - gap;        //这里就是看j的前一个相对位置的数据
				while(k >= 0 && arr[k] > temp)   //这里是挨个做比较。和插入排序差不多
				{
    
    
					arr[k + gap] = arr[k];
					k -= gap;
				}
				arr[k + gap] = temp;  //这里也和插入排序同理
			}
		}
	}
}

int main()
{
    
    
    int array[10] = {
    
    3, 90, 43, 5, 65, 23, 12, 34, 6, 8};
    ShellSort(array,10);

    for(int i = 0; i < 10; i++)
    {
    
    
        printf("%d  ",array[i]);
    }
    printf("\n");

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43296982/article/details/128094050