排序算法和查找 例子详解

选择排序

#include<stdio.h>
void select_sort(int data[],int size){
    int i,j;
		for (i = 1;i < size; ++i){
				int pos = i - 1;
		    for(j = i - 1; j < size; ++j){
					 if(data[pos] > data[j]){
					     pos = j;
					 }
				}
				if(pos != i - 1){
				  int tmp;
					tmp = data[pos];
					data[pos] = data[i - 1];
					data[i - 1] = tmp;
				}
				int k = 0;
				for (k = 0;k < size;k++){
				    printf("%d ",data[k]);
				}
				printf("\n");
		
		}
     
}

int main(){
		int data[] = {5,3,4,2,1,8,7,6,9,0};
		int size = sizeof(data) / sizeof(data[0]);
		int i;
		for (i = 0; i< size; i++){
		    printf("%d ",data[i]);
		}
		printf("\n");
		select_sort(data,size);
		for (i = 0; i< size; i++){
		    printf("%d ",data[i]);
		}
		printf("\n");

		


}

插入排序

#include<stdio.h>
/*
 插入排序
*/
void insert_sort(int data[],size_t size){
     int i = 1,j;
		 for (i = 1; i < size; ++i){
         int tmp = data[i];
		     for(j = i; j > 0 && tmp < data[j - 1]; --j){
             data[j] = data[j - 1];
				 }
				 data[j] = tmp;
				 // show the change of each time
	       int k;
				 for (k = 0; k < size; ++k){
	           printf("%d ",data[k]);
	       }
	       printf("\n");
				 // show the change of each time
		 }
     
     
}


int main()
{
   int data[] = {3,5,2,4,1,9,7,8,6};
	 size_t size = sizeof(data) /  sizeof(data[0]);
	 int i;
	 for (i = 0; i < size; ++i){
	     printf("%d ",data[i]);
	 }
	 printf("\n");
	 insert_sort(data,size);
	 for (i = 0; i < size; ++i){
	     printf("%d ",data[i]);
	 }
	 printf("\n");
}


冒泡排序

#include <stdio.h>
void bubble_sort(int data[], size_t size){
    int j,k,i;
		for (j = 0; j < size - 1; j++){   // 10个数只需9次遍历,交换到最后
		    int flag = 0;                 // 的数字已是最大,就不用比较交换
			  for (k = 0; k < size - 1; k++){
					  if(data[k] > data[k + 1]){
					  	int tmp = data[k];
							data[k] = data[k + 1];
							data[k + 1] = tmp;
							flag = 1;
						}
				}
				if (flag == 0){
					break;
				}
	      for (i = 0; i < size; ++i){
	          printf("%d ",data[i]);
				}
				printf("\n");
		}
}

int main()
{
  int data[] = {2,5,4,1,3,6,8,9,7,0};
	size_t size = sizeof(data) / sizeof(data[0]);
	int i;
	for (i = 0; i < size; ++i){
	    printf("%d ",data[i]);
	}
	printf("\n");
  bubble_sort(data,size);
	for (i = 0; i < size; ++i){
	    printf("%d ",data[i]);
	}
	printf("\n");
	

	return 0;
}

快速排序

#include <stdio.h>
int size;
void quick_sort(int data[],int left,int right){
	   int mid = (left + right) / 2;
	   int p = mid, pivot = data[mid];
	   //显示排序时所找的下标
       printf("mid = %d %d\n",mid,pivot);
	   int i = left, j = right;
	   while(i < j){
	   		for(;!(i >= p || data[i] > pivot);i++);
		  		if (i < p){
			 	data[p] = data[i];
			 	p = i;
		  	}
		    for(;!(j <=  p || data[j] <= pivot);j--);
				if(j > p){
				data[p] = data[j];
				p = j;
			}
			
	   }
	   data[p] = pivot;
	   // 输出每次排序的结果
	   for (i = 0; i < size; ++i){
	       printf("%d ",data[i]);
	   }
	   
	   printf("\n");
	   if (p - left > 1){
	   		quick_sort(data,left,p-1);
	   }
	   if (right - p > 1)
	   quick_sort(data,p+1,right);
}
int main()
{
  int data[] = {3,2,1,4,7,6,5,8,9};
  size = sizeof(data) / sizeof(data[0]);
	int i;
	// 数组中原有的值进行打印
	for (i = 0; i < size; ++i){
	    printf("%d ",data[i]);
	}
	printf("\n");
	quick_sort(data,0,size - 1);
	//排好序后的数组进行打印
	for (i = 0; i < size; ++i){
	    printf("%d ",data[i]);
	}
	printf("\n");
	return 0;
}

线性查找

#include<stdio.h>
int liner_sort(int data[],size_t size,int key){
    int i = 0;
		for (i =0; i < size; ++i){
		    if(data[i] == key){
				   return i;
				}
		}
		return -1;
}
int main()
{
  int data[] = {1,3,6,2,4,5,7,8,19};
	int key;
	size_t size = sizeof(data) / sizeof(data[0]);
	size_t i;
	for(i = 0;i < size; i++){
	   printf("%d ",data[i]);
	}
	printf("\n");
	printf("please input the number you want to find.\n");
	scanf("%d",&key);
	int pos = liner_sort(data,size,key);
  if(pos == -1){
	  printf("the element is missing.\n");
	}
	else{
	  printf("the position of %d is at %d\n",key,pos);
	}
	return 0;
}


二分查找

#include <stdio.h>
/*
 二分查找算法
 (1)注意的是首先先进行排序的操作
 (2)若要调用递归,就要看当前完成的函数是否能解决下面所要面对的问题
*/
int binary_sort(int data[],int left,int right,int key){
		if (!data || left < 0 || right <0 || left > right ){
		   return -1;
		}   // 采用递归的方式解决问题
	  int beg = left, end = right;
		while(beg <= end){
		   int mid = (beg + end) / 2;
			 if (data[mid] < key){
			    return binary_sort(data, mid + 1, right, key);
			 }else if(data[mid] > key){
			    return binary_sort(data, left, mid-1, key);
			 }else {
			    return mid;
			 }
		}
		return -1;
}
int binary(int data[],int left,int right,int key){
    if (!data || left < 0 || right < 0 || left > right){
				return -1;
		}  // 采用循环的方式来解决问题 
    while (left <= right){
				  int mid = (left + right) / 2;
					if(data[mid] == key){
					   return mid;
					}else if(data[mid] < key){
						 left = mid + 1;
					}else {
						 right = mid - 1;
					}
		}
    return -1;
}

int main()
{
	 int data[] = {1,2,3,4,5,6,7,8,9};  //调用二分查找注意数组必须有序
	 int size = sizeof(data) / sizeof(data[0]);
   size_t i;
	 for (i = 0;i < size; i++){
	     printf("%d ",data[i]);
	 }
	 printf("\n");
	 int key;
	 printf("please input the number you want to find.\n");
	 scanf("%d",&key);
	 int pos = binary(data, 0, size -1,key);
	 // int pos = binary_sort(data,0,size - 1,key);
   if (pos == -1){
	    printf("we can not find this element.\n");
	 }
	 else {
	    printf("the number of %d is at the %d position.\n",key,pos);
	 }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值