现有一顺序表,表中元素分别为{51,38,79,22,91,105,33,52,16,112},分别编写函数实现以下操作:
A、采用简单插入排序法实现对顺序表的排序,显示每一趟的排序结果;
B、采用简单冒泡排序法实现对顺序表的排序,显示每一趟的排序结果;
C、采用简单选择排序法实现对顺序表的排序,显示每一趟的排序结果;
D、编写顺序查找函数;
E、编写二分查找函数。
编写主函数main,依次完成:初始化顺序表 (调用顺序查找函数,在顺序表中查找关键字为52和关键字为36的元素,分别显示查找结果 (调用简单插入排序、简单冒泡排序、简单选择排序分别实现顺序表的排序,并显示结果 (调用二分查找函数,查找关键字为22的元素,显示查找结果。
# include<stdio.h>
//冒泡排序
void BubbleSort(int* arr, int n)
{
int i,count=1;
int end = n;
while (end)
{
int flag = 0;
for (int i = 1; i < end; ++i)
{
if (arr[i - 1] > arr[i])
{
int tem = arr[i];
arr[i] = arr[i - 1];
arr[i - 1] = tem;
flag = 1;
}
}
if (flag == 0)
{
break;
}
--end;
//输出每一趟的结果
printf("第%d趟排序:",count++);
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
}
//插入排序
void InsertSort(int* arr, int n)
{
int k,count=1;
for (int i = 0; i < n - 1; ++i)
{
//记录有序序列最后一个元素的下标
int end = i;
//待插入的元素
int tem = arr[end + 1];
//单趟排
while (end >= 0)
{
//比插入的数大就向后移
if (tem < arr[end])
{
arr[end + 1] = arr[end];
end--;
}
//比插入的数小,跳出循环
else
{
break;
}
}
//tem放到比插入的数小的数的后面
arr[end + 1] = tem;
//代码执行到此位置有两种情况:
//1.待插入元素找到应插入位置(break跳出循环到此)
//2.待插入元素比当前有序序列中的所有元素都小(while循环结束后到此)
//输出每一趟的结果
printf("第%d趟排序:",count++);
for(k=0;k<n;k++)
{
printf("%d ",arr[k]);
}
printf("\n");
}
}
//选择排序
void selectSort(int array[] , int size)
{
int i,j,k,min,temp,count=1;
//需要的主循环趟数比实际的数据个数少1
for(i = 0; i < size - 1;i++)
{
min = i;
for(j = i + 1; j < size; j++ )
{
if(array[j] < array[min])
{
min = j;
}
}
if(min != i)
{
temp = array[min];
array[min] = array[i];
array[i] = temp;
}
printf("第%d趟排序:",count++);
for(k=0;k<size;k++)
{
printf("%d ",array[k]);
}
printf("\n");
}
}
// 顺序查找
int Search_Sq01(int *num, int len, int key)
{
int i;
for(i = 1; i <= len; i++)
{
if (num[i] == key)
{
return i;
}
}
return -1;
}
int Binary_search(int arr[],int key,int n)
{
int low = 0; //定义low为0号元素
int high = n - 1; //定义high为下标最大的元素
int mid; //数组中间元素的下标
while (low <= high) //只要低号位元素小于或等于高号位元素,说明还没查找到元素,循环继续
{
mid = (low + high) / 2; //中间元素下标定义
if (arr[mid] < key) //当所查找的元素比中间值大,说明要查找的元素在右半区,
{
low = mid + 1; //key在右半区,改变low的值
}
else if (arr[mid] > key) //当所查找的元素比中间值小,说明要查找的元素在左半区,
{
high = mid - 1; //key在左半区,改变high的值
}
else //如果前面两个条件都不满足,说明已经找到key 满足条件 key==mid 返回mid
{
return mid;
}
}
return -1; //当跳出循环还没有返回值,说明没找到想要的元素,返回-1
}
int main(){
int i;
int index;
int arr1[10]={51,38,79,22,91,105,33,52,16,112};
//冒泡排序
printf("冒泡排序:\n");
BubbleSort(arr1, 10);
printf("\n");
//插入排序
printf("插入排序:\n");
InsertSort(arr1, 10);
printf("\n");
//选择排序
printf("选择排序:\n");
selectSort(arr1,10);
printf("\n");
// 顺序查找
index=Search_Sq01(arr1,10,52);
printf("顺序查找52的index:%d\n",index);
index=Search_Sq01(arr1,10,36);
printf("\n");
if(index==-1){printf("没有该元素\n");}
else{printf("顺序查找36的index:%d\n",index);}
//二分查找,只能是排序后的数组,
printf("\n");
index=Binary_search(arr1,22,10);
if(index==-1){printf("没有该元素\n");}
else{printf("二分查找22的index:%d\n",index);}
return 0;
}
A. 插入排序
void insertion_sort(int arr[],int len){
for(int i=1;i<len;i++){
int key=arr[i];
int j=i-1;
while((j>=0) && (key<arr[j])){
arr[j+1]=arr[j];
j--;
}
arr[j+1]=key;
}
}
B. 冒泡排序
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;
}
}
C, 选择排序
void swap(int *a,int *b) //交換兩個變數
{
int temp = *a;
*a = *b;
*b = temp;
}
void selection_sort(int arr[], int len)
{
int i,j;
for (i = 0 ; i < len - 1 ; i++)
{
int min = i;
for (j = i + 1; j < len; j++) //走訪未排序的元素
if (arr[j] < arr[min]) //找到目前最小值
min = j; //紀錄最小值
swap(&arr[min], &arr[i]); //做交換
}
}
完整代码
#include<stdio.h>
void insertion_sort(int arr[], int len) ; // 插入排序
void bubble_sort(int arr[], int len) ; // 冒泡排序
void swap(int *a, int *b); // 交换元素
void selection_sort(int arr[], int len) ; // 选择排序
void print_map(int arr[], int len, int n); // 打印 列表
int in_order_to_find(int arr[], int len, int num) ; // 顺序查找
int binary_search(int key, int a[], int n); // 二分查找
int main() {
int list[10] = {51, 38, 79, 22, 91, 105, 33, 52, 16, 112};
// 顺序找 52
int flag_52 = 0;
flag_52 = in_order_to_find(list, 10, 52);
if ( flag_52 >= 0 ) {
printf("顺序查找法找到52的下标为 %d \n", flag_52);
} else {
printf("没有找到 52 这个元素\n");
}
// 顺序找 36
int flag_36 = 0;
flag_36 = in_order_to_find(list, 10, 36);
if ( flag_36 >= 0 ) {
printf("顺序查找法找到36的下标为 %d \n", flag_36);
} else {
printf("没有找到 36 这个元素\n");
}
// 插入排序
int list_1[10] = {51, 38, 79, 22, 91, 105, 33, 52, 16, 112};
insertion_sort(list_1, 10);
// 冒泡排序
int list_2[10] = {51, 38, 79, 22, 91, 105, 33, 52, 16, 112};
bubble_sort(list_2, 10);
// 选择排序
int list_3[10] = {51, 38, 79, 22, 91, 105, 33, 52, 16, 112};
selection_sort(list_3,10);
// 二分找 22
binary_search(22,list_3,10);
}
void insertion_sort(int arr[], int len) {
printf("插入排序:\n");
for (int i = 1; i < len; i++) {
int key = arr[i];
int j = i - 1;
while ((j >= 0) && (key < arr[j])) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
print_map(arr, len, i);
}
}
void bubble_sort(int arr[], int len) {
printf("冒泡排序\n");
int i, j, temp, flag = 1;
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;
print_map(arr, len, flag++);
}
}
}
}
void swap(int *a, int *b) { //交換兩個變數
int temp = *a;
*a = *b;
*b = temp;
}
void selection_sort(int arr[], int len) {
printf("选择排序\n");
int i, j;
for (i = 0 ; i < len - 1 ; i++) {
int min = i;
for (j = i + 1; j < len; j++) //走訪未排序的元素
if (arr[j] < arr[min]) //找到目前最小值
min = j; //紀錄最小值
swap(&arr[min], &arr[i]); //做交換
}
}
void print_map(int arr[], int len, int n) {
if ( n > 0 ) {
printf("第%d趟的结果 :", n);
}
for ( int i = 0 ; i < len ; i++ ) {
printf("%d ", arr[i]);
}
printf("\n");
}
int in_order_to_find(int arr[], int len, int num) {
// 顺序查找
for ( int i = 0 ; i < len ; i++ ) {
if ( arr[i] == num ) {
return i;
}
}
// 没有找到
return -1;
}
int binary_search(int key, int a[], int n) {
// 二分查找
int low, high, mid, count = 0, count1 = 0;
low = 0;
high = n - 1;
while (low < high) { //査找范围不为0时执行循环体语句
count++; //count记录査找次数
mid = (low + high) / 2; //求中间位置
if (key < a[mid]) //key小于中间值时
high = mid - 1; //确定左子表范围
else if (key > a[mid]) //key 大于中间值时
low = mid + 1; //确定右子表范围
else if (key == a[mid]) { //当key等于中间值时,证明查找成功
printf("查找成功!\n 查找 %d 次! 元素 %d 的下标为 %d ", count, key, mid); //输出査找次数及所査找元素在数组中的位置
count1++; //count1记录查找成功次数
break;
}
}
if (count1 == 0) //判断是否查找失敗
printf("查找元素 %d 失敗!",key); //査找失敗输出no found
return 0;
}