您的位置:首页 > 编程语言 > C语言/C++

C 【冒泡 选择排序 & 折半查找】

2016-04-11 23:41 309 查看
#include <stdio.h>

/** 冒泡 */
void bubbleSort(int number[], int length);

/** 选择 */
void selectSort(int number[], int length);

/** 折半 */
int findKeySort(int number[], int length, int key);

/** 交换两数数值 */
void change(int number[], int i, int j);

int main(int argc, const char * argv[]) {

printf("请输入您要输入的数字个数,并包含一个数字88:\n");
int length;
int key = 88;
scanf("%d", &length);
printf("请输入数字:\n");
int number[length];
for (int i = 0; i < length; i++) {
scanf("%d", &number[i]);
}

bubbleSort(number, length);
selectSort(number, length);
printf("88是数组中的第%d个数字\n", findKeySort(number, length, key) + 1);

return 0;
}

/** 冒泡 */
void bubbleSort(int number[], int length)
{
for (int i = 0; i < length - 1; i++) { // 比较的趟数
for (int j = 0; j < length - i - 1; j++) { // 每趟比较多少次(从number[0]开始,相邻两数比较,合适的交换。第一趟比较,也就是i=0时,需要比较 n-0-1 次)
if (number[j] > number[j + 1]) {
change(number, j, j + 1);
}
}
}

for (int i = 0; i < length; i++) {
printf("%-d ", number[i]);
}

printf("\n");
}

/** 选择 */
void selectSort(int number[], int length)
{
int k = 0;
for (int i = 0; i < length - 1; i++) { // 除了最后一项,前n-1项都需要向后比较
k = i;
for (int j = i + 1; j < length; j++) { // 每次选中的值需要和它后面的n-i个值比较(i+1 ~ n)
if (number[k] > number[j]) {
k = j; // 每一次外循环符合条件的值记录下坐标,暂时不交换数组元素的值
}
}

// 每次外循环结束才交换一次,相比冒泡交换的次数更少
change(number, i, k);
}

for (int i = 0; i < length; i++) {
printf("%-d ", number[i]);
}

printf("\n");
}

/** 折半 */
int findKeySort(int number[], int length, int key)
{
int max = length - 1;
int min = 0;
int mid;

while (min <= max) {
mid = (max + min) / 2;
if (number[mid] < key) {
min = mid + 1;
} else if (number[mid] > key) {
max = mid - 1;
} else
return mid;
}

return -1;
}

/** 交换两数数值 */
void change(int number[], int i, int j)
{
int temp = number[i];
number[i] = number[j];
number[j] = temp;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息