zoukankan      html  css  js  c++  java
  • 六种常见算法实例

    不想废话,直接上代码,代码都是调试过的。

    实现的算法有:冒泡,直接选择,直接插入,归并,二叉堆,快速排序这六种。

    对于后三种的理解方法,请百度这个系列的文章“白话经典算法系列 ”,个人感觉作者讲的特别不错!

    下面贴代码

    #include <stdio.h>
    #include <conio.h>
    //冒泡排序
    void BubbleSort(int arry[], int n)
    {
    	int i, j, k;
    	for (i = 0; i < n; i++)
    	{
    		k = 0;
    		for (j = 0; j < n - 1; j++)
    		{
    			if (arry[j] > arry[j + 1])
    			{
    				int t = arry[j];
    				arry[j] = arry[j+1];
    				arry[j+1] = t;
    				k = 1;
    			}
    		}
    		if (k == 0)
    			break;
    	}
    }
    //插入排序
    void InsertSort(int arry[], int n)
    {
    	//{ 9,23,1,8,5,13,7,12,0,4 };
    	int i, j, k;
    	for (i = 1; i < n; i++)
    	{
    		k = arry[i];
    		for (j = i - 1; j >= 0&& arry[j] >=k; j--)
    		{
    			arry[j + 1] = arry[j];
    		}
    		arry[j + 1] = k;
    	}
    }
    //选择排序
    void SelectSort(int arry[], int n)
    {
    	int i, j, k;
    	for (int i = 0; i < n; i++)
    	{
    		k = i;
    		for (j = i+1; j < n; j++)
    		{
    			if (arry[k]> arry[j])
    			{
    				k = j;
    			}
    		}
    		int t = arry[i];
    		arry[i] = arry[k];
    		arry[k] = t;
    	}
    }
    //堆排序
    //最小堆向上向下排列函数
    void MakeMinHeapUp(int arry[], int i)
    {
    	int j = (i - 1) / 2;
    	int temp = arry[i];
    	while (j >= 0)
    	{
    		if (arry[j] < arry[i])
    			break;
    		arry[i] = arry[j];
    		i = j;
    		j = (j - 1) / 2;
    	}
    	arry[i] = j;
    }
    void MakeMinHeapDown(int arry[],int n,int i)
    {
    	int j = i * 2 + 1;
    	int temp = arry[i];
    	while (j < n)
    	{
    		if (j+1<n&&arry[j + 1] < arry[j])
    			j++;
    		if (arry[i] < arry[j])
    			break;
    		arry[i] = arry[j];
    		i = j;
    		j = 2 * j + 1;
    	}
    	arry[i] = temp;
    }
    //最大堆向上向下排列函数
    void MakeMaxHeapUp(int arry[], int i)
    {
    	int j = (i - 1) / 2;
    	int temp = arry[i];
    	while (j >= 0)
    	{
    		if (arry[j] > arry[i])
    			break;
    		arry[i] = arry[j];
    		i = j;
    		j = (j - 1) / 2;
    	}
    	arry[i] = j;
    }
    void MakeMaxHeapDown(int arry[], int n, int i)
    {
    	int j = i * 2 + 1;
    	int temp = arry[i];
    	while (j < n)
    	{
    		if (j + 1<n&&arry[j + 1] > arry[j])
    			j++;
    		if (arry[i] > arry[j])
    			break;
    		arry[i] = arry[j];
    		i = j;
    		j = 2 * j + 1;
    	}
    	arry[i] = temp;
    }
    //生成最小堆,排序后为降序
    void MakeMinHeap(int arry[], int n)
    {
    	for (int i = n / 2 - 1; i >= 0; i--)
    	{
    		MakeMinHeapDown(arry, n, i);
    	}
    }
    //生成最大堆,排序后为升序
    void MakeMaxHeap(int arry[], int n)
    {
    	for (int i = n / 2 - 1; i >= 0; i--)
    	{
    		MakeMaxHeapDown(arry, n, i);
    	}
    }
    void HeapSortMain(int arry[], int n)
    {
    	int temp;
    	for (int i = n - 1; i >= 1; i--)
    	{
    		temp = arry[i];
    		arry[i] = arry[0];
    		arry[0] = temp;
    		//MakeMinHeap(arry, i);
    		MakeMaxHeap(arry, i);
    	}
    }
    void HeapSort(int arry[],int n)
    {
    	//MakeMinHeap(arry, n);
    	MakeMaxHeap(arry, n);
    	HeapSortMain(arry, n);
    }
    
    
    //快速排序
    int GetIndex(int arry[], int l, int r)
    {
    	int i = l, j = r;
    	int k = arry[l];
    	while (i < j)
    	{
    		while (i<j&&k<arry[j])
    		{
    			j--;
    		}
    		if (i < j)
    		{
    			arry[i] = arry[j];
    			i++;
    		}
    		while (i<j&&k>arry[i])
    		{
    			i++;
    		}
    		if (i < j)
    		{
    			arry[j] = arry[i];
    			j--;
    		}
    	}
    	arry[i] = k;
    	return i;
    }
    void QuickSortMain(int arry[], int l, int r)
    {
    	if (l < r)
    	{
    		int mid = GetIndex(arry, l, r);
    		QuickSortMain(arry, l, mid-1);
    		QuickSortMain(arry, mid + 1, r);
    	}
    }
    void QuickSort(int arry[], int n)
    {
    	QuickSortMain(arry, 0, n - 1);
    }
    
    //归并排序
    void MergeArry(int arry[], int first, int mid, int last, int temp[])
    {
    	int i = first, j = mid + 1;
    	int k = 0;
    	while (i <= mid&&j <= last)
    	{
    		if (arry[i]>arry[j])
    		{
    			temp[k++] = arry[j++];
    		}
    		else
    		{
    			temp[k++] = arry[i++];
    		}
    	}
    	while (i <= mid)
    	{
    		temp[k++] = arry[i++];
    	}
    	while (j <= last)
    	{
    		temp[k++] = arry[j++];
    	}
    	for (i = 0; i < k; i++)
    	{
    		arry[first + i] = temp[i];
    	}
    }
    void MergeSortMain(int arry[],int first,int last,int temp[])
    {
    	if (first < last)
    	{
    		int mid = (first + last) / 2;
    		MergeSortMain(arry, first, mid,temp);
    		MergeSortMain(arry, mid + 1, last,temp);
    		MergeArry(arry, first, mid, last, temp);
    	}
    }
    void MergeSort(int arry[],int n)
    {
    	int *p = new int[n];
    	if (p == NULL)
    	{
    		return;
    	}
    	MergeSortMain(arry, 0, n - 1, p); 
    	delete[] p;
    }
    
    int main()
    {
    	//int arry[10] = { 9,8,7,6,5,4,3,2,1,0 };
    	int arry[10] = { 9,23,1,8,5,13,7,12,0,4 };
    	//BubbleSort(arry, 10);
    	//InsertSort(arry, 10);
    	//SelectSort(arry, 10);
    	//ShellSort(arry, 10);
    	//QuickSort(arry, 10);
    	//MergeSort(arry, 10);
    	//HeapSort(arry, 10);
    	int i = 0;
    	for (; i < 10; i++)
    	{
    		printf("%d ", *(arry + i));
    	}
    	getch();
    }
    

      

  • 相关阅读:
    使用yum更新时不升级Linux内核的方法
    centos7 redmine安装过程(转载)
    CentOS7安装GitLab、汉化、邮箱配置及使用(转载)
    [bzoj2780][Spoj8093]Sevenk Love Oimaster_广义后缀自动机
    [bzoj2595][WC2008]游览计划/[bzoj5180][Baltic2016]Cities_斯坦纳树
    [bzoj4006][JLOI2015]管道连接_斯坦纳树_状压dp
    OI模板のpoke流[大型考试复习必备/kl]
    [bzoj2453]维护队列_带修改莫队
    [bzoj4519][Cqoi2016]不同的最小割_网络流_最小割_最小割树
    [bzoj3894]文理分科_网络流_最小割
  • 原文地址:https://www.cnblogs.com/cjw1115/p/4850510.html
Copyright © 2011-2022 走看看