10大排序算法(C语言实现)

大一刚放寒假期间,回想一下马上进入大学时的心情,记得在暑假时加了一个学校acm战队的群,当时感觉很美好,想开学的时候努力一下进入校队的acm。可是自己又特别喜欢渗透,于是就把acm这个想法放下了,这几天把SQLlabs干完了,出于闲想看看算法。记得当时写C课设的时候,冒泡排序也把我整一段时间才迷糊过来。好,废话不多说,记录一下自己的学习成果。

写在前面

这些总结是根据菜鸟教程上的知识,加上自己的实验和思考的成果。 十大经典排序算法.在这里我先说一下:下边所有的算法排序结果都从大到小

1.冒泡排序

算法思路:
这个算法了解过的非常好理解,大致说下就是:比较相邻数据,如果不符合规则(大的数在前或者小的数在前)就交换着两个数的位置。但是如果数据是:6,5,7(要求是大的数在前)根据上述所说的,得到的结果:6,7,5。这显然不符合要求,需要再经过一次循环才可得到正确的序列。因此冒泡排序的根本是:(如果要求序列是大的数在前)经过一次遍历循环后最小的数交换到整个数据的末尾。依次类推第二个小的数就在整个数据的倒数第二位,最后最大的数就在第一位。排序成功。

#include <stdio.h>
void bubble_sort(int arr[], int len) 
{
        int i, j, temp;
        for (i = 0; i < len - 1; i++)
        {
                for (j = 0; j < len - 1 - i; j++)
                {
                        if (arr[j] > arr[j + 1]) 
                        {
                                temp = arr[j];
                                arr[j] = arr[j + 1];
                                arr[j + 1] = temp;
                        }
                 }
        }
}
int main() {
        int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35};
        int len = (int) sizeof(arr) / sizeof(*arr);
        bubble_sort(arr, len);
        int i;
        for (i = 0; i < len; i++)
        {
                printf("%d ", arr[i]);
        }
        return 0;
}

2.选择排序

算法思路:
假设第一个数据最大,遍历这个数据后边的所有数据,发现后边有数据大于这一个数据,记录较大的数据,继续往后遍历直到遍历一遍所有数据,之后交换数据,此时第一个数据即为整个数据的最大数。依次类推,假设第二个数据最大,遍历这个数据后边的所有数据,发现后边有数据大于这一个数据,记录较大的数据,继续往后遍历直到遍历一遍所有数据,之后交换数据。

#include<stdio.h>
int main() 
{
	int a[7]={6,3,7,5,9,10,2};
	int i=0,j=0,max;
	int temp,len=7;
	for(i = 0;i<len;i++)        //判断i是否小于len,执行下面的语句
	{
		max = i;           //假设此次循环中的最大值就是当前的值   
		for(j = i+1;j<len;j++)
		{
			if(a[j]>a[max])    //将假设的当前最大值与后面的值比较
			{
				max = j;     //若后面的值更大,则交换下标
			}
		}//当前最大值
		if(max != i)       //比较之后如果此次循环中最大值并非当前值
		{ 
			temp = a[i];   //将此次循环中的最大值与a[k]交换
			a[i] = a[max];
			a[max] = temp;
		}
	}
	for(int q=0 ; q<7; q++)
		printf("%d ",a[q]);
}

3.插入排序

算法思路:(为了具有普遍性,在此假设前3个数据已经过插入排序成为正序)
取出第四个数据,此时第四个数据的位置空出,如果第三个数据小于第四个数据,将第三个数据换到第四个数据的位置,此时第三个数据位置空出,如果仍小于,则以此类推。如果不小于则将取出的这个数据放到第三个数据的位置。

#include<stdio.h>
int main()
{
	int arr[7]={6,3,7,5,9,10,2};
	int i,j,key,len=7;
    for(i=1;i<len;i++)
	{
        key = arr[i];//将数据取出来
        j=i-1;
        while((j>=0) && (arr[j]<key)) //如果不满足条件进入循环
		{
            arr[j+1] = arr[j];//移到前一个数据的位置,空出后一个数据的位置
            j--;
        }
        arr[j+1] = key;
    }
	for(int q=0 ; q<7; q++)
		printf("%d ",arr[q]);
}

4.希尔排序

#include<stdio.h>
int main()
{
	int arr[7]={6,3,7,5,9,10,2};
    int gap, i, j,len=7;
    int temp;
    for (gap = len >> 1; gap > 0; gap >>= 1)
    {
        for (i = gap; i < len; i++) 
		{
            temp = arr[i];
            for (j = i - gap; j >= 0 && arr[j] < temp; j -= gap)
            {
               	arr[j + gap] = arr[j];
			}
            arr[j + gap] = temp;
        }
	}
    for(int q=0 ; q<7; q++)
		printf("%d ",arr[q]);
}

5.归并排序

#include<stdio.h>
#include<stdlib.h>
int min(int x, int y) 
{
    return x < y ? x : y;
}
int main()
{
	int arr[7]={6,3,7,5,9,10,2},len=7;
    int *a = arr;
    int *b = (int *) malloc(len * sizeof(int));
    int seg, start;
    for (seg = 1; seg < len; seg += seg) {
        for (start = 0; start < len; start += seg * 2) {
            int low = start, mid = min(start + seg, len), high = min(start + seg * 2, len);
            int k = low;
            int start1 = low, end1 = mid;
            int start2 = mid, end2 = high;
            while (start1 < end1 && start2 < end2)
                b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
            while (start1 < end1)
                b[k++] = a[start1++];
            while (start2 < end2)
                b[k++] = a[start2++];
        }
        int *temp = a;
        a = b;
        b = temp;
    }
    if (a != arr) {
        int i;
        for (i = 0; i < len; i++)
            b[i] = a[i];
        b = a;
    }
    free(b);
	for(int q=0 ; q<7; q++)
		printf("%d ",arr[q]);
}

6.快速排序

十大经典排序算法

7.堆排序

十大经典排序算法

8.计数排序

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

void print_arr(int *arr, int n) {
        int i;
        printf("%d", arr[0]);
        for (i = 1; i < n; i++)
                printf(" %d", arr[i]);
        printf("\n");
}

void counting_sort(int *ini_arr, int *sorted_arr, int n) {
        int *count_arr = (int *) malloc(sizeof(int) * 100);
        int i, j, k;
        for (k = 0; k < 100; k++)
                count_arr[k] = 0;
        for (i = 0; i < n; i++)
                count_arr[ini_arr[i]]++;
        for (k = 1; k < 100; k++)
                count_arr[k] += count_arr[k - 1];
        for (j = n; j > 0; j--)
                sorted_arr[--count_arr[ini_arr[j - 1]]] = ini_arr[j - 1];
        free(count_arr);
}

int main(int argc, char **argv) {
        int n = 10;
        int i;
        int *arr = (int *) malloc(sizeof(int) * n);
        int *sorted_arr = (int *) malloc(sizeof(int) * n);
        srand(time(0));
        for (i = 0; i < n; i++)
                arr[i] = rand() % 100;
        printf("ini_array: ");
        print_arr(arr, n);
        counting_sort(arr, sorted_arr, n);
        printf("sorted_array: ");
        print_arr(sorted_arr, n);
        free(arr);
        free(sorted_arr);
        return 0;
}

9.桶排序

十大经典排序算法

10.基数排序

#include<stdio.h>
#define MAX 20
//#define SHOWPASS
#define BASE 10

void print(int *a, int n) {
  int i;
  for (i = 0; i < n; i++) {
    printf("%d\t", a[i]);
  }
}

void radixsort(int *a, int n) {
  int i, b[MAX], m = a[0], exp = 1;

  for (i = 1; i < n; i++) {
    if (a[i] > m) {
      m = a[i];
    }
  }

  while (m / exp > 0) {
    int bucket[BASE] = { 0 };

    for (i = 0; i < n; i++) {
      bucket[(a[i] / exp) % BASE]++;
    }

    for (i = 1; i < BASE; i++) {
      bucket[i] += bucket[i - 1];
    }

    for (i = n - 1; i >= 0; i--) {
      b[--bucket[(a[i] / exp) % BASE]] = a[i];
    }

    for (i = 0; i < n; i++) {
      a[i] = b[i];
    }

    exp *= BASE;

#ifdef SHOWPASS
    printf("\nPASS   : ");
    print(a, n);
#endif
  }
}

int main() {
  int arr[MAX];
  int i, n;

  printf("Enter total elements (n <= %d) : ", MAX);
  scanf("%d", &n);
  n = n < MAX ? n : MAX;

  printf("Enter %d Elements : ", n);
  for (i = 0; i < n; i++) {
    scanf("%d", &arr[i]);
  }

  printf("\nARRAY  : ");
  print(&arr[0], n);

  radixsort(&arr[0], n);

  printf("\nSORTED : ");
  print(&arr[0], n);
  printf("\n");

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值