归并排序,二分查找,快速排序,选择排序,插入排序————————c语言实现

归并排序:

这样看来其实和分治法差不多的,主要是都用到了递归,这次的程序转自别人的,非原创,但是写的很清晰。但是我运行了一下发现会崩溃也不晓得哪里出错了,希望有人能够看到问题帮我指正一下,谢谢。

1,划分问题:把序列分成元素个数尽量相等的两半

2,递归求解:把两半元素分别排序

3,合并问题:把两个有序表合并成一个。

#include
#include

void merge(int arr[], int low, int mid, int high)
{
    int i, k;
    int* tmp = (int*)malloc((high-low+1)*sizeof(int));
    int left_low = low;
    int left_high = mid;
    int right_low = mid;
    int right_high = high;
    
    for(k = 0; left_low <= left_high && right_low <= right_high; k++){
        if(arr[left_low] <= arr[right_low]){
            tmp[k] = arr[left_low++];
        }else{
            tmp[k] = arr[right_low++];
        }
        //如果左边的数组还有剩余元素,就直接接到后面去
        if(left_low <= left_high){
            for(i = left_low; i <= left_high; i++) tmp[k++] = arr[i];
        }
        if(right_low <= right_high){
            for(i = right_low; i <= right_high; i++) tmp[k++] = arr[i++];
        }
    }
    for(i = 0; i < high-low+1; i++) arr[i] = tmp[i];
    free(tmp);
    return;    
}

void merge_sort(int arr[], unsigned int first, unsigned int last){
    int mid = 0;
    if(first < last){
        mid = first+(last-first)/2;
        merge_sort(arr, first, mid);
        merge_sort(arr, mid, last);
        merge(arr, first, mid, last);
    }
    return;
}

int main(){
    int i;
    int a[7] = {32,12,56,78,76,45,36};
    merge_sort(a, 0, 6);
    printf("排序后:");
    for(i = 0; i < 7; i++) printf("%d ", &a[i]);
}

 

//快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

void quick_sort(int* a,int n){
    
    int i,j;
    if(n < 2) return;   //递归边界
    int p = a[n/2];
    //把比p小的全部放在左边,比p大的全部放在右边
    for(i = 0, j = n-1;;i++, j--){
        while(a[i] < p) i++;
        while(a[j] > p)  j--;
        if(i >= j) break;
        int tmp = a[i]; a[i] = a[j]; a[j] = tmp;
    }
    quick_sort(a, i);
    quick_sort(a+i, n-i); 
}

int main(){
    int a[] = {2,5,7,3,-1,1,4};
    int n = sizeof(a)/sizeof(a[0]);
    int i;
    quick_sort(a,n);
    for(i = 0; i < n; i++)
        printf("%d", a[i]);

 

//二分查找:假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

 
int binarySearch(int* a, int n, int key){
    int low = 0;
    int high = n-1;
    while(low < high){
        int mid = low + (high-low)/2;
        int midsum = a[mid];
        if(midsum < key) low = mid+1;
        else if(midsum > key) high = mid-1;
        else return mid;
    }
    return 1;
}

int main()
{
    int ret;
    int a[] = {1,3,4,6,7,8,15,79};
    int n = sizeof(a)/sizeof(a[0]);
    int key;
    scanf("%d", &key);
    ret = binarySearch(a, n, key);
    if(ret == 1)
    printf("查找失败\n");
    else
    printf("查找成功\n");
}

 

把选择排序加一下

#include 
using namespace std;

//选择排序:每次都在待排序的数列中选择最小的那个元素放在已排好序的数列的后面
void BinarySerch(int a[], int n)
{
 	//i之前的是已经排好的数列 
	for(int i = 0; i < n-1; i++)
	{
		int min = i;
		//循环数组找出最小的那个数 
		for(int j = i+1; j <= n-1; j++)
		{
			if(a[j] <= a[min])
			{
				min = j;
			}
		}
		
		int tmp = a[i];
		a[i] = a[min];
		a[min] = tmp;	
	}
 } 
 
 int main()
 {
 	int a[10] = {2, 32, 1, 4, 56, 3, 0, 67, 99, 100};
 	BinarySerch(a, 10);
 	for(int i = 0; i < 10; i++)
 	cout << a[i] << endl;
 	
 }

 

插入排序(新增)

 //插入排序
 void InsertSerch(int a[], int n)
 {
 	int i, j;
 	//以i为分界线,左边是已经拍好的,右边是没有排的 
 	for(i = 1; i <= n-1; i++)
 	{
		for(j = 0; j <= i-1; j++)
		{
			if(a[i] > a[j])
				continue;
			else
			{
				for(int k = j; k >= 0; k--)
			}
		}
		
	 }
  } 

 

你可能感兴趣的:(归并排序,二分查找,快速排序,选择排序,插入排序————————c语言实现)