0
点赞
收藏
分享

微信扫一扫

恭喜你~遇到了最有趣的排序算法

目录

开篇介绍

首先啥是排序?

​一、插入排序

1、直接插入排序

2、希尔排序

二、选择排序

1、简单选择排序

2、堆排序

三、交换排序

1、冒泡排序

2、快速排序

四、归并排序

五、基数排序

总结 


开篇介绍

首先啥是排序?

内部排序分为:插入排序(直接插入排序和希尔排序)、选择排序(简单选择排序和堆排序)、交换排序(冒泡排序和快速排序)、归并排序、基数排序,如下图所示。那么下面我们来看看吧。

​一、插入排序

1、直接插入排序

是不是很像抓扑克?是不是很形象?我们来看看插入排序的代码

void InsertSort(int *a,int n)
{
    for(int i = 1; i < n; i ++)
    {
        int j = i - 1, k = a[i];
        while(j >= 0 && a[j] > k)
        {
            a[j + 1] = a[j];
            j --;
        }
        a[j + 1] = k;
    }
}

定义一个数组(int a[] = {7,12,6,34,9,11,26,17,40,3};),跑一下数据。

2、希尔排序

直接看代码咯(同样是和上面的数据)~

void ShellSort(int a[],int n) {
	int temp,j,i;
	int mid = ceil(n /2);
	for (mid; mid >= 1; mid = ceil(mid / 2)) {
		for (i = mid;i < n;i++) {
			if (a[i] < a[i - mid]) {
				temp = a[i];
				for (j = i - mid;j >=0 && a[j] > temp;j=j-mid) {
					a[j + mid] = a[j];
				}
				a[j + mid] = temp;
			}
		}
	}
}

二、选择排序

1、简单选择排序

void SelectSort(int a[] ,int n)
{

	for(int i = 0; i < n; i ++)
    {
		int Index = i;
		for(int j = i + 1; j < n; j ++)
        {
			if(a[j] < a[Index])
			{
				Index = j;
			}
		}
		swap(a[i] ,a[Index]);
	}
}

 

2、堆排序

看完图之后我们来看看代码。


void AdjustHeap(int a[], int r, int l){
        int left = 2 * r + 1;
        int right = 2 * r + 2;
        int Max = r;
        if( left < l && a[left] > a[Max])
                Max = left;
        if( right < l && a[right] > a[Max])
                Max = right;
        if(Max != r){
                swap( a[Max], a[r]);
                AdjustHeap(a, Max, l);
        }
}

void HeapSort(int* a, int len){
        for(int i = len/2 -1; i >= 0; --i)
                AdjustHeap(a, i, len);

        for(int i = len - 1; i >= 0; i--){
                swap(a[0], a[i]);
                AdjustHeap(a, 0 , i);
        }
}

 

三、交换排序

1、冒泡排序

简单吧?有趣吗?我们直接来看看代码

void BubbleSort(int a[],int len)
                                
{
	for (int i = 0; i < len - 1; i ++)	
	{
		for (int j = 0; j < len - i - 1; j ++)	 
		{
			if(a[j + 1] < a[j])	
			{
				int temp = a[j];
				a[j] = a[j+1];
				a[j + 1] = temp;
			}
		}
	}	
}

2、快速排序

话不多说,直接看代码

void QuickSort(int a[], int l, int r){

    if(l >= r) return;

    int x = a[l], i = l - 1, j = r + 1;
    while(i < j){
        do i ++; while(a[i] < x);
        do j --; while(a[j] > x);
        if(i < j) swap(a[i], a[j]);
    }

    QuickSort(a, l, j);
    QuickSort(a, j + 1, r);
}

四、归并排序

我们来看看代码

void MergeSort(int a[], int l, int r){
    if(l >= r) return ;
    int mid = (l + r) >> 1;
    MergeSort(a, l, mid);
    MergeSort(a, mid + 1, r);
    int k = 0, i = l, j = mid + 1;
    while(i <= mid && j <= r){
        if(a[i] <= a[j]) t[k++] = a[i++];
        else t[k++] = a[j++];
    }
    while(i <= mid){
        t[k++] = a[i++];
    }
    while(j <= r){
        t[k++] = a[j++];
    }
    for(int i = l, j = 0; j <= k - 1; ){
        a[i++] = t[j++];
    }
}

五、基数排序

代码如下

int MaxDigit(int a[], int n)
{
    int t = 1;
    int p = 10;
    for(int i = 0; i < n; ++i)
    {
        while(a[i] >= p)
        {
            p *= 10;
            ++ t;
        }
    }
    return t;
}
void indexSort(int a[], int n)
{
    int d = MaxDigit(a, n);
    int t[n];
    int count1[10];
    int i, j, k;
    int index = 1;
    for(i = 1; i <= d; i++)
    {
        for(j = 0; j < 10; j++)
            count1[j] = 0;
        for(j = 0; j < n; j++)
        {
            k = (a[j] / index) % 10;
            count1[k]++;
        }
        for(j = 1; j < 10; j++)
            count1[j] = count1[j - 1] + count1[j];
        for(j = n - 1; j >= 0; j--)
        {
            k = (a[j] / index) % 10;
            t[count1[k] - 1] = a[j];
            count1[k]--;
        }
        for(j = 0; j < n; j++)
            a[j] = t[j];
        index = index * 10;
    }
}

总结 

举报

相关推荐

0 条评论