C语言冒泡排序:指针和数组两种方法

冒泡排序

冒泡排序,基本思想是采用双重循环,外层循环用于控制冒泡的轮数,内层循环控制每一轮冒泡的次数,每一轮冒泡都会产生一个最大或者最小的数放在数组的末尾,下一轮循环时,只需要从剩余的元素找出一个最大或者最小数,知道整个数组有序。

数组方法

#define _CRT_SECURE_NO WARINGS 1
#include<stdio.h>
#include<windows.h>

//打印输出函数
void Print(int ar[], int size)
{
    
    
	for (int i = 0; i <size; i++){
    
    
		printf("%d ",ar[i]);
}
	printf("\n");
}

//用Swap函数来交换两个变量的值
void Swap(int* a, int* b) {
    
    
	*a = *a ^ *b;
	*b = *a ^ *b;
	*a = *a ^ *b;
}

void BubbleSort(int ar[], int size)
{
    
    
	int flag = 1;
	//外层控制冒泡轮数,内层控制每轮冒泡次数
	for (int i = 0; i < size - 1; i++) {
    
    
	//此处注意循环执行的条件,因为每一轮结束都会找出一个最大\
	或者最小的数,所以size-1后面有-i,否则会有重复的比较
		for (int j = 0; j < size - 1-i; j++) {
    
    
			if (ar[j] > ar[j+ 1]) {
    
    
				Swap(& ar[j], & ar[j + 1]);
				flag = 0;//数组元素发生交换时flag赋0
			}
		}
		//若flag为1,表示本轮没有进行交换,则表明当前\
		  数组已经有序,无需再进行冒泡
		if (flag) {
    
    
			break;
}
	}
}

int main()
{
    
    
	int arr[] = {
    
    24,10,9,88,65,30};
	//	冒泡前后分别打印一次
	Print(arr,6);
	BubbleSort(arr, 6);
	Print(arr, 6);
	system("pause");
	return 0;
}

指针方法

#include<stdio.h>
#include<windows.h>
#include<assert.h>

void Print(int *p, int sz)
{
    
    
	assert(p);

	for (int i = 0; i < sz; i++){
    
    
		printf("%d ", *p++);
	}
	printf("\n");
}

void BubbleSort(int*p, int sz)
{
    
    
	int flag = 1;//标记
	assert(p);
	for (int i = 0; i < sz - 1; i++){
    
    
		for (int j = 0; j < sz - 1-i;j++){
    
    
			if (*(p + j) < *(p + j + 1)){
    
    
				//异或法交换两个数的值
				*(p + j) ^= *(p + j + 1);
				*(p + j + 1) ^= *(p + j);
				*(p + j) ^= *(p + j + 1);
				flag = 0;
			}
		}
		//若一轮冒泡后没有发生顺序改变,则说明数组已经有序
		if (flag){
    
    
			break;
		}
	}
}

int main()
{
    
    
	int ar[] = {
    
     0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int sz = sizeof(ar) / sizeof(ar[0]);
	Print(ar, sz);
	BubbleSort(ar, sz);
	Print(ar, sz);

	system("pause");
	return 0;
}

Guess you like

Origin blog.csdn.net/qq_44631587/article/details/119379940