冒泡排序 & 选择排序 & 折半查找

150 篇文章 0 订阅

冒泡排序

#include <stdio.h>
#include <stdlib.h>
#define LEN 100
//函数声明...
void toBubbleSort(int * arr, int len);
// main 函数
int main(int argc, const char * argv[])
{
	//	int arr[] = { 22, 33, 55, 44, 11, 99, 66 };
	int arr[LEN];
	int len = sizeof(arr) / sizeof(int);
	for (int i = 0; i < len; i++) {
		arr[i] = arc4random_uniform(1000); // 0~99
	}

	toBubbleSort(arr, len);

	for (int i = 0; i < len; i++) {
		printf("%d\t", arr[i]);
	}

	printf("\n");

	return 0;
}
/**
 *  冒泡排序
 *
 *  @param arr 数组
 *  @param len 数组长度
 */
void toBubbleSort(int * arr, int len)
{
	for (int i = 0; i < len - 1; i++) {
		for (int j = 0; j < len - 1 - i; j++) {
			if (arr[j] > arr[j + 1]) {
				arr[j] = arr[j] ^ arr[j + 1];
				arr[j + 1] = arr[j] ^ arr[j + 1];
				arr[j] = arr[j] ^ arr[j + 1];
			}
		}
	}
}


选择排序

#include <stdio.h>
#include <stdlib.h>
#define LEN 100
//函数声明...
void toBubbleSort(int * arr, int len, int order);
void toSelectionSort(int * arr, int len, int order);
typedef enum {
	descend,
	ascend

} Order;
// main 函数
int main(int argc, const char * argv[])
{

	int arr[LEN];
	int len = sizeof(arr) / sizeof(int);
	for (int i = 0; i < len; i++) {
		arr[i] = arc4random_uniform(100); // 0~99
	}
	toBubbleSort(arr, len, ascend);
	//	toSelectionSort(arr, len, ascend);
	for (int i = 0; i < len; i++) {
		printf("%d\t", arr[i]);
	}

	printf("\n");

	return 0;
}
/**
 *  选择排序
 *
 *  @param arr 数组
 *  @param len 数组长度
 */
void toSelectionSort(int * arr, int len, int order)
{
	if (order) {
		for (int i = 0; i < len - 1; i++) {
			for (int j = i + 1; j < len; j++) {
				if (arr[i] > arr[j]) {
					arr[i] = arr[j] ^ arr[i];
					arr[j] = arr[i] ^ arr[j];
					arr[i] = arr[i] ^ arr[j];
				}
			}
		}
	}
	else {
		for (int i = 0; i < len - 1; i++) {
			for (int j = i + 1; j < len; j++) {
				if (arr[i] < arr[j]) {
					arr[i] = arr[j] ^ arr[i];
					arr[j] = arr[i] ^ arr[j];
					arr[i] = arr[i] ^ arr[j];
				}
			}
		}
	}
}

/**
 *  冒泡排序
 *
 *  @param arr 数组
 *  @param len 数组长度
 */
void toBubbleSort(int * arr, int len, int order)
{

	if (order) {
		for (int i = 0; i < len - 1; i++) {
			for (int j = 0; j < len - 1 - i; j++) {
				if (arr[j] > arr[j + 1]) {
					arr[j] = arr[j] ^ arr[j + 1];
					arr[j + 1] = arr[j] ^ arr[j + 1];
					arr[j] = arr[j] ^ arr[j + 1];
				}
			}
		}
	}
	else {
		for (int i = 0; i < len - 1; i++) {
			for (int j = 0; j < len - 1 - i; j++) {
				if (arr[j] < arr[j + 1]) {
					arr[j] = arr[j] ^ arr[j + 1];
					arr[j + 1] = arr[j] ^ arr[j + 1];
					arr[j] = arr[j] ^ arr[j + 1];
				}
			}
		}
	}
}

二分查找 & 二分插入 & continue的注意点


#include <stdio.h>
#include <stdlib.h>
#define LEN 10
//函数声明...
void toBubbleSort(int * arr, int len, int order);
void toSelectionSort(int * arr, int len, int order);
void toFindKey(int * arr, int key, int len);
int toBinarychop(int * arr, int key, int len);
int insertItemLoc(int * arr, int key, int len);
typedef enum {
	descend,
	ascend

} Order;
// main 函数
int main(int argc, const char * argv[])
{

	int arr[LEN];
	int len = sizeof(arr) / sizeof(int);
	for (int i = 0; i < len; i++) {
		arr[i] = arc4random_uniform(100) * 3; // 0~99
	}
	//	toBubbleSort(arr, len, ascend);
	toSelectionSort(arr, len, ascend);
	for (int i = 0; i < len; i++) {
		printf("index = %d , %d\n", i, arr[i]);
		//        printf("%d\t",arr[i]);
	}
	printf("\n");

	//****** 无序数组中查找key ****************** stone ***
	//	int key = 77;
	// intdex??
	//	toFindKey(arr, key, len);
	//****** 折半查找 ****************** stone ***

	//	int key = arc4random_uniform(100) * 3;
	//	int index = toBinarychop(arr, key, len);
	//
	//	printf("key = %d, index = %d\n", key, index);

	//********插入元素, 保持有序 **************** stone ***
	int key = arc4random_uniform(100) * 3;
	int index = insertItemLoc(arr, key, len);

	printf("key = %d, index = %d\n", key, index);
	int arrTo[len + 1];
	for (int i = 0, j = 0; i < len + 1; i++, j++) {
		if (i != index) {
			arrTo[i] = arr[j];
		}
		else {
			arrTo[i] = key;
			j--;
		}
	}

	for (int i = 0; i < len + 1; i++) {
		printf("index = %d , %d\n", i, arrTo[i]);
	}
	return 0;
}

int insertItemLoc(int * arr, int key, int len)
{
	int low = 0;
	int high = len - 1;
	int mid = 0;
	while (low <= high) {
		mid = (low + high) / 2; // 注 : mid 需要循环中不断改变, 不能写在外面
		if (key < arr[mid]) {
			high = mid - 1;
		}
		else if (key > arr[mid]) {
			low = mid + 1;
		}
		else {
			return mid + 1;
		}
	}
	return low;
}
/**
 *  二分查找(有序数组中适用)
 *
 *  @param arr 数组
 *  @param key key
 *  @param len 数组长度
 *
 *  @return 返回index , -1 表示没找到
 */
int toBinarychop(int * arr, int key, int len)
{
	int low = 0;
	int high = len - 1;
	int mid = 0;
	while (low <= high) {
		mid = (low + high) / 2; // 注 : mid 需要循环中不断改变, 不能写在外面
		if (key < arr[mid]) {
			high = mid - 1;
		}
		else if (key > arr[mid]) {
			low = mid + 1;
		}
		else {
			return mid;
		}
	}
	return -1;
}
/**
 *  无序数组中查找key
 *
 *  @param arr 数组
 *  @param key key
 *  @param len 数组长度
 */
void toFindKey(int * arr, int key, int len)
{
	int i = 0;
	while (arr[i] != key) {
		i++;
		if (i == len) {
			break;
		}
	}

	if (i == len) {
		printf("没找到\n");
	}
	else {
		printf("index = %d\n", i);
	}
}
/**
 *  选择排序
 *
 *  @param arr 数组
 *  @param len 数组长度
 */
void toSelectionSort(int * arr, int len, int order)
{
	if (order) {
		for (int i = 0; i < len - 1; i++) {
			for (int j = i + 1; j < len; j++) {
				if (arr[i] > arr[j]) {
					arr[i] = arr[j] ^ arr[i];
					arr[j] = arr[i] ^ arr[j];
					arr[i] = arr[i] ^ arr[j];
				}
			}
		}
	}
	else {
		for (int i = 0; i < len - 1; i++) {
			for (int j = i + 1; j < len; j++) {
				if (arr[i] < arr[j]) {
					arr[i] = arr[j] ^ arr[i];
					arr[j] = arr[i] ^ arr[j];
					arr[i] = arr[i] ^ arr[j];
				}
			}
		}
	}
}

/**
 *  冒泡排序
 *
 *  @param arr 数组
 *  @param len 数组长度
 */
void toBubbleSort(int * arr, int len, int order)
{

	if (order) {
		for (int i = 0; i < len - 1; i++) {
			for (int j = 0; j < len - 1 - i; j++) {
				if (arr[j] > arr[j + 1]) {
					arr[j] = arr[j] ^ arr[j + 1];
					arr[j + 1] = arr[j] ^ arr[j + 1];
					arr[j] = arr[j] ^ arr[j + 1];
				}
			}
		}
	}
	else {
		for (int i = 0; i < len - 1; i++) {
			for (int j = 0; j < len - 1 - i; j++) {
				if (arr[j] < arr[j + 1]) {
					arr[j] = arr[j] ^ arr[j + 1];
					arr[j + 1] = arr[j] ^ arr[j + 1];
					arr[j] = arr[j] ^ arr[j + 1];
				}
			}
		}
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值