从今天开始学数据结构(c/c++)之排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lulujiang1996/article/details/82423833

排序算法:快速,冒泡,选择,直接插入,堆排序,归并排序
二分查找,hash算法,贪心算法,分治算法,动态规划算法,随机划分算法,回溯算法等,STL,查找算法

#include <iostream>
using namespace std;
void select_sort(int a[],int n)
{
  for(int i=0;i<n;i++)
  {  //取出最小的值和a[i]比较
	  int min=i;
	  for(int j=i+1;j<n;j++)
		 if(a[min]>a[j])
			 min=j;
	  if(min!=i)
	  {int temp=a[i];
	   a[i]=a[min];
	   a[min]=temp;
	  }
	   
  }
}
void insert_sort(int a[],int n)
{
	int i,j,k;
    // 20,30,40,10,60,50
	for(i=1;i<n;i++)
	{
		//找到打破排序的值
		for(j=i-1;j>=0;j--)
			if( a[j]<a[i])
				break;
		//找到的a[j]<a[i],故i插在j的位置后
		if(j!=i-1)
		{
			//将无序的值取出
			int temp=a[i];
			//这里,a[j]一定小于a[i],故j一定在i位置前,这里需要将>a[i]的值向后移动
			for(k=i-1;k>j;k--)
				a[k+1]=a[k];

                       //将a[i]插入到j的后面位置
			a[j+1]=temp;
		}
	}
}
void quick_sort(int a[],int low,int high)
{
	if(low<high){
	int i=low,j=high,temp=a[low]; 
		//先找右小,后找左大
	while(i<j)
	{
		while(i<j&&a[j]>=temp)
			j--;
		if(i<j)
			a[i++]=a[j];
		while(i<j&&a[i]<=temp)
			i++;
		if(i<j)
			a[j--]=a[i];
		
	}
	a[i]=temp;
	quick_sort(a,low,i-1);
	quick_sort(a,i+1,high);
	}
	
}
void bubble_sort(int a[],int n)
{
	int i,j,temp;
	int flag;
	//共n轮,每轮会有一个最大数沉底
	for(i=n-1;i>0;i--)
	{
		flag=0;
		for(j=0;j<i;j++)
		{
			if(a[j]>a[j+1])
			{temp=a[j];
			    a[j]=a[j+1];
			    a[j+1]=temp;
			 //若发生交换,则标记为1
			flag=1;
			}
			
		}
		//某一趟中没有进行交换
		if(flag==0)
		break;
	}
	
}
int main()
{
	int a[]={1,3,5,2,4,6};
	for(int i=0;i<6;i++)
		cout<<a[i];
	cout<<endl;
    //bubble_sort(a,6);
	//quick_sort(a,0,5);
	insert_sort(a,6);
	for(int i=0;i<6;i++)
		cout<<a[i];
    return 0;
}
#include <iostream>
using namespace std;
/堆排序:大根堆向下调整
//性质一:索引为i的左孩子的索引是(2 * i + 1);
//性质二:索引为i的左孩子的索引是(2 * i + 2);
//性质三:索引为i的父结点的索引是 floor((i - 1) / 2);
//参数start -- 被下调节点的起始位置(一般为0,表示从第1个开始)
//参数end   -- 截至范围(一般为数组中最后一个元素的索引)
void maxHeapDown(int a[], int start, int end)
{
    int current = start;            // 当前(current)节点的位置
    int left = 2 * current + 1;        // 为左(left)孩子的位置
    int tmp = a[current];            // 当前(current)节点的值
    for (; left <= end; current = left, left = 2 * left + 1)
    {
         // "left"是左孩子,"left+1"是右孩子
         if (left < end && a[left] < a[left + 1])
			 left++;        // 左右两孩子中选择较大者
         if (tmp >= a[left])
             break;        // 调整结束
         else            // 交换值
         {
             a[current] = a[left];
             a[left] = tmp;
         }
    }
}
//堆排序(升序):交换数据,将a[1]和a[n]交换,使a[n]是a[1...n]中的最大值;然后将a[1...n-1]重新调整为最大堆。
void Heap_Sort_Asc(int a[], int n)
{
    int i, tmp;
    for (i = n / 2 - 1; i >= 0; i--)		// 从(n/2-1) --> 0逐次遍历。遍历之后,得到的数组实际上是一个(最大)二叉堆。
        maxHeapDown(a, i, n - 1);
	//交换数据
    for (i = n - 1; i > 0; i--)
    {
        // 交换a[0]和a[i]。交换后,a[i]是a[0...i]中最大的。
        tmp = a[0];
        a[0] = a[i];
        a[i] = tmp;
        // 调整a[0...i-1],使得a[0...i-1]仍然是一个最大堆。
        maxHeapDown(a, 0, i - 1);
    }
}
//归并排序:将两个相邻有序区间合并成一个
void merge(int* a, int start, int mid, int end)
{
    int *tmp = new int[end - start + 1];    // tmp是汇总2个有序区的临时区域
    int i = start;            // 第1个有序区的索引
    int j = mid + 1;        // 第2个有序区的索引
    int k = 0;                // 临时区域的索引
 
    while (i <= mid && j <= end)
    {
        if (a[i] <= a[j])
            tmp[k++] = a[i++];
        else
            tmp[k++] = a[j++];
    }
    while (i <= mid)
        tmp[k++] = a[i++];
 
    while (j <= end)
        tmp[k++] = a[j++];
 
    // 将排序后的元素,全部都整合到数组a中。
    for (i = 0; i < k; i++)
        a[start + i] = tmp[i];
 
    delete[] tmp;
}
//归并排序:从上到下(递归方式)
void Merge_Sort(int* a, int start, int end)
{
    if (a == NULL || start >= end)
        return;
 
    int mid = (end + start) / 2;
	Merge_Sort(a, start, mid);		// 递归排序a[start...mid]
	Merge_Sort(a, mid + 1, end);		// 递归排序a[mid+1...end]
 
    // a[start...mid] 和 a[mid...end]是两个有序空间,
    // 将它们排序成一个有序空间a[start...end]
    merge(a, start, mid, end);
}
int main()
{
	int a[]={1,3,5,2,4,6};
	for(int i=0;i<6;i++)
		cout<<a[i];
	cout<<endl;
    //bubble_sort(a,6);
	//quick_sort(a,0,5);
	//insert_sort(a,6);
	//select_sort(a,6);
	Heap_Sort_Asc(a, 6);
	for(int i=0;i<6;i++)
		cout<<a[i];
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lulujiang1996/article/details/82423833