c++ 最简单的排序 桶排序,冒泡,快速排序,选择排序,插入排序

int main() {
	int a[10],i=0,j;
	printf("请输入十个数字:\n");
	for (; i < 10; i++) {
		scanf("%d",&a[i]);
	}
	printf("未进行排序之前:\n");
	for (i = 0; i < 10; i++) {
		printf("%5d",a[i]);
	};
	for (int i = 0; i < 9; i++)  //总共需要排序num-1次
	{
		int index = i; //index用于代表无序区最大值的索引
		for (int j = i + 1; j < 10; j++)  //遍历无序区域,找到无序区域最大值的索引
		{
			if (a[j] > a[index])
			{
				index = j;
			}
		}
		//把无序区的最大值放到无序区域的第一个位置
		if (index != i)
		{
			int temp = a[i];
			a[i] = a[index];
			a[index] = temp;
		}
	}

	printf("\n进行排序之后:\n");
	for (i = 0; i < 10; i++)
		printf("%5d", a[i]);
	printf("\n");
	
	system("pause");
	return 0;
}

1.桶排序

1. 知道要排序的最大的那个数 例如 M ===== int a[M+1] =0;

2.创建 int a[M+1] =0 个桶

3.出现一个数,往对应的桶里加1

4.循环打印出不==0的桶

例如: 班上有5个同学,分别考了 8,5,5,3,2. 满分为10

int main() {
	int a[11] = {0},i=0,j=0,temp = 0;
	
	for (i=0; i < 5; i++) {
		printf("请输入一个数:\n");
		scanf("%d",&j);
		a[j]++;
	}

	for (i = 0; i <= 10; i++) {
		for (j = 1; j <=a[i];j++)
			printf("排序后:%d", i);
	}
	system("pause");
	return 0;
}

例如:尝试 输入 n 个 0~1000之间的整数 从大到小排序

int main() {
	int a[1001] = {0},i=0,j=0, n;
    for (i =0; i<1001;i++) //计为m次
    a[i] = 0;
	scanf ("%d",&n);//输入一个数n表示接下来有n个数 // n次
	for (i=0; i < n; i++) {//循环读入n个数,并进行桶排序
		printf("请输入一个数:\n");
		scanf("%d",&j);//把一个数读入变量j中
		a[j]++;//进行计数,对编号为j的桶放一个小旗子
	}

	for (i = 1000; i >= 0; i--) { //依次判断 1000-0个桶 //m 次
		for (j = 1; j <=a[i];j++) // n次
			printf("排序后:%d", i);//出现了几次就将桶的编号打印几次
	}
	system("pause");
	return 0;
}
时间复杂度 O = 2 (m + n) 忽略较小的常数 o = M+N

2.冒泡排序

基本思想:每次比较两个相邻的元素,如果他们的顺序错误就把他们交换

int main (){
    int a[100],i,j,t,n;
    scanf("%d",&n);//输入一个数,表示接下来有n个数
    for (i = 0; i < n; i++) {
    scanf("%d",&a[i]);
    }
    //核心代码
    for (i=0;i<n-1;i++) {//n个数,只需要进行n-1趟
        for (j=0;j< n-i;j++) {
            if (a[j] < a[j+1]) {
                t = a[j];
				a[j] = a[j+1];
				a[j + 1] = t;              
            }
        }
    }
    for (i = 0; i < n; i++) {
		printf("排序后:%d\n", a[i]);
	}
    
}

3.快排

基本原理:找到一个基准数,大于基准数放在右边,小于放在左边

int a[101], n;//定义全局变量,这两个变量在子函数里会用
void quicksort(int left , int right) {
	int i, j, t, temp;
	if (left > right) return;
	temp = a[left];//temp 中 存的是基准数字
	i = left;
	j = right;
	while (i != j) {
		//顺序很重要,要从右往左找起
		while (a[j] >= temp && i < j) 
			j--;
		//再从左边往右边找
		while (a[i] <= temp && i < j) 
			i++;
			
		//交换两个数在数组中的位置
		if (i < j) {//当哨兵i和j没有相遇时
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
	}
	//最终将基准数归位
	a[left] = a[i];
	a[i] = temp;
	quicksort(left,i-1); //继续处理左边的
	quicksort(i+1,right);//继续处理右边的
	return;
}


int main() {
	int i, j;
	scanf("%d",&n);
	for (i = 1; i <= n; i++) {
		scanf("%d",&a[i]);
	}
	quicksort(1,n);
	for (i = 1; i <= n; i++) {
		printf("%d\n",a[i]);
	}
	
	system("pause");
	return 0;
}

4.选择法

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据有序。

//与冒泡的区别在于,冒泡是每每比较相邻两个数并进行交换位置。选择是先记下来,最后进行交换

int main() {
	int a[10],i=0,j;
	printf("请输入十个数字:\n");
	for (; i < 10; i++) {
		scanf("%d",&a[i]);
	}
	printf("未进行排序之前:\n");
	for (i = 0; i < 10; i++) {
		printf("%5d",a[i]);
	};
	for (int i = 0; i < 9; i++)  //总共需要排序num-1次
	{
		int index = i; //index用于代表无序区最大值的索引
		for (int j = i + 1; j < 10; j++)  //遍历无序区域,找到无序区域最大值的索引
		{
			if (a[j] > a[index])
			{
				index = j;
			}
		}
		//把无序区的最大值放到无序区域的第一个位置
		if (index != i)
		{
			int temp = a[i];
			a[i] = a[index];
			a[index] = temp;
		}
	}

	printf("\n进行排序之后:\n");
	for (i = 0; i < 10; i++)
		printf("%5d", a[i]);
	printf("\n");
	
	system("pause");
	return 0;
}

5.插入排序

void insertSort(int a[], int len) {
	for (int i = 1; i < len; i++) {
		int tmp = a[i];
		int j = i - 1;
		while (j >= 0 && tmp < a[j]) {
			a[j + 1] = a[j];
			j--;
		}
		a[j + 1] = tmp;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_41475854/article/details/86511635