数据结构8大排序

直接插入排序:

#include <stdio.h>
void InsertSort(int b[],int size)
{
    int i,j;
    int temp = 0;
    for(i = 0; i < size; i++)
    {
        int temp = b[i];
        for(j = i - 1; j >= 0; j--)
        {
            if(temp > b[j])
            {
                b[j + 1] = b[j];
            }
            else
            {
                break;
            }
        }
        b[j + 1] = temp;
    }
}
int main()
{
    int i;
    int a[] = {3,5,1,7,6,9,0,4,19,2};
    int length = sizeof(a) / sizeof(a[0]);

    InsertSort(a, length);

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

    return 0;
}

希尔排序:

#include <stdio.h>
void ShellSort(int b[],int size)
{
    int i,j;
    int temp = 0,h;
    for(h = size / 2; h > 0; h /= 2)
    {
    for(i = h; i < size; i += h)
    {
        int temp = b[i];
        for(j = i - h; j >= 0; j -= h)
        {
            if(temp > b[j])
            {
                b[j + h] = b[j];
            }
            else
            {
                break;
            }
        }
        b[j + h] = temp;
    }
    }
}
int main()
{
    int i;
    int a[] = {3,5,1,7,6,9,0,4,19,2};
    int length = sizeof(a) / sizeof(a[0]);

    ShellSort(a, length);

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

    return 0;
}

简单选择排序:

#include <stdio.h>
void SelectSort(int *num, int n)
{
    int i,j;
    int tmp = 0,min = 0;
    for(i = 0; i < n - 1; i++)
    {
        min = i;
        for(j = i + 1; j < n; j++)
        {
            if(num[j] < num[min])
            {
                min = j;
            }
        }
        if(min != i)
        {
            tmp = num[i];
            num[i] = num[min];
            num[min] = tmp;
        }
    }
}
int main()
{
    int i,len;
    int num[]={2,7,3,0,5,6,12,4};
    len = sizeof(num) / sizeof(num[0]);
    SelectSort(num,len);
    for(i = 0; i < len; i++)
    {
        printf("%d ",num[i]);
    }
    return 0;
}

快速排序:

#include <stdio.h>
int a[100];
int n;
void QuickSort(int low,int high)
{
    int i=low,j=high;
    int temp,temp1;
    if(low >= high)
    {
        return;
    }
    while(i < j)
    {
        while(i < j && a[low] >= a[j])
        {
            j--;
        }
        while(i < j && a[i] >= a[low])
        {
            i++;
        }
        if(i < j)
        {
            temp = a[i];
            a[i] = a[j];
            a[j] =temp;
        }
        temp1 = a[i];
        a[i] = a[low];
        a[low] = temp1;

        QuickSort( low, i - 1);
        QuickSort( i + 1, high);
    }
}
int main()
{
    int i;
    printf("Please input num:\n");
    scanf("%d",&n);
    printf("Please input:");
    for(i = 1; i <= n; i++)
    {
        scanf("%d",&a[i]);
    }

    QuickSort(1,n);

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

堆排序:

#include <stdio.h>

void AdjustMinHeap(int *a,int pos,int len)
{
    int temp;
    int child;
    for(temp = a[pos];2 * pos + 1 <= len; pos = child)
    {
        child = 2 * pos + 1;
        if(child < len && a[child] >a[child + 1])
        {
            child++;
        }
        if(a[child] < temp)
        {
            a[pos] = a[child];
        }
        else
        {
            break;
        }
    }
    a[pos] = temp;
}
void Swap(int *a,int *b)
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}

void print(int *a, int length)
{
    int i;

    for (i = 0; i < length; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
}
void HeapSort(int *array,int len)
{
    int i;
    for(i = len / 2 - 1; i >= 0; i--)
    {
        AdjustMinHeap(array,i,len - 1);
    }
    for(i = len - 1; i >= 0; i--)
    {
        Swap(&array[0],&array[i]);
        AdjustMinHeap(array,0,i - 1);
    }
}
int main()
{
    int array[]={0,13,14,27,18,1};
    int length = sizeof(array) / sizeof(array[0]);
    HeapSort(array,length);
    print(array,length);
    return 0;
}

归并排序:


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

void Merge(int a[],int start, int middle,int end )
{
	int num1 = middle + 1 - start;
	int num2 = end - middle;
	
	int *A = (int*)malloc(sizeof(int) *num1);
	int *B = (int*)malloc(sizeof(int) *num2);
	
	int i,j,k;
	
	for(i = 0,k = start; i < num1 ;i++,k++)
	{
		A[i] = a[k];
	}
	
	for(j = 0,k = middle + 1;j < num2 ;j++,k++)
	{
		B[j] = a[k];
	}
	
	for(i = 0, j = 0,k = start ;i < num1 && j < num2; k++)
	{
		if( A[i] < B[j] )
		{
			a[k] = A[i];
			i++;
		}
		else
		{
			a[k] = B[j];
			j++;
		}
	}
	
	if( i < num1 )
	{
		for( j = i;j < num1 ;j++,k++)
		{
			a[k] = A[j];
		}
	}
	
	if( j < num2 )
	{
		for( i = j;i < num2 ;i++,k++)
		{
			a[k] = B[i];
		}
	}
}

void MergeSort(int a[], int start, int end )
{
	int i;
	int middle;
	if(start < end )
	{
		middle = ( start + end ) / 2;
		
		MergeSort(a, start, middle );
	/*	i=0;
		while( i < 4 )
	{
		printf("%d ",a[i]);
		i++;
	}
	printf("\n");*/
		MergeSort(a, middle + 1, end );
	/*	i=4;
			while( i < 8 )
	{
		printf("%d ",a[i]);
		i++;
	}
	printf("\n");*/
		Merge(a,start,middle,end);
	}
}

int main()
{
	int i = 0;
	int a[]= {8,4,5,7,1,3,6,2};
	int length = sizeof( a ) / sizeof( a[0] );

	MergeSort(a, 0, length - 1);
	
	while( i < length )
	{
		printf("%d ",a[i]);
		i++;
	}
	
	printf("\n");
	
	return 0;
}




基数排序:

#include <stdio.h>

int Getmax(int *a, int n)
{
	int i, max;
	max = a[0];

	for(i = 0; i < n; i++)
	{
		if(max < a[i])
		{
			max = a[i];
		}
	}
	return max;
}

int countsort(int *a,int n, int exp)
{
	int output[n];
	int buckets[10] = {0};
	int i;
	printf("*5*\n");
	for(i = 0; i < n; i++)
	{
		buckets[(a[i] / exp) % 10]++;
	}

	printf("*4*\n");
	for(i = 1; i < n; i++)
	{
		buckets[i] += buckets[i - 1];
	}

	printf("*3*\n");
	for(i = n - 1; i >= 0; i--)
	{
		output[buckets[(a[i] / exp) % 10] - 1] = a[i];
		buckets[(a[i] / exp) % 10]--;
	}
	
	printf("*2*\n");
	for(i = 0; i < n; i++)
	{
		a[i] = output[i];
	}
	return 1;
}



int Radixsort(int *a, int n)
{
	int exp;
	int max = Getmax(a, n);

	printf("*1*\n");
	for(exp = 1; (max / exp) > 0; exp *= 10 )
	{
		countsort(a,n,exp);
	}
	return 1;

}

int main()
{
	int i;
	int a[] = {278, 109, 63, 930, 589, 184, 505, 269, 8, 83};
	int len = sizeof(a) / sizeof(a[0]);

	Radixsort(a, len);
	for(i = 0; i < len; i++)
	{
		printf("%d ", a[i]);
	}

	return 0;
}

冒泡(略) 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值