排序

1、冒泡排序

#include <iostream>
#include<cmath>
using namespace std;    

void Bubble(int a[], int n)
{
   for (int i = 0; i < n;i++)
      for (int j = i; j < n; j++)
      {
         if (a[i]>a[j])                     //从小到大
	    swap(a[i], a[j]);
      }
}
int main() 
{
	int n;
	int b[80] = { 0 };
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> b[i];

	Bubble(b, n);

	for (int i = 0; i < n; i++)
		cout<< b[i]<<" ";

	return 0;
}

2、选择排序

选择排序是一种简单的排序方法,它的基本思想是: 
第一次从R[0]~R[n-1]中选取最小值,与R[0]交换, 
第二次从R[1]~R[n-1]中选取最小值,与R[1]交换, 
…., 
第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换, 
….., 
第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换, 
共通过n-1次,得到一个从小到大排列的有序序列。

void Select(int a[], int n)
{
   for (int i = 0; i < n; i++)
   {
      int min = i;
     for (int j = i+1; j < n; j++)
      {
         if (a[min] > a[j])
	     min = j;
       }
        swap(a[min], a[i]);
    }
}

3、插入排序

void Insert(int a[], int n)
{
  for (int i = 1; i < n; i++)
  {
    for (int j = i-1; j >=0 && a[j]>a[j+1]; j--)
    {
	  swap(a[j], a[j+1]);
    }
		
  }
}

4、快速排序

void Quick(int a[], int left, int right)
{
  if (left < right)
 {
    int low = left;
    int high = right;
    int key = a[left];
   while (low < high)
   {
      while (low < high && a[high] >= key)
       {
	    high--;
       }
       a[low] = a[high];
     while (low < high && a[low] <= key)
      {
	   low++;
       }
     a[high] = a[low];
   }                        //小while结束
    a[low] = key;
    Quick(a, left, low - 1);
    Quick(a, low + 1, right);
 }
   else
	 return;
}

5、归并排序

#include <iostream>

using namespace std;
int a[] = { 23, 65, 12, 3, 8, 76, 345, 90, 21, 75, 34, 61 };
int len = sizeof(a) / sizeof(a[0]);
int * c = new int[len];

void mergeArray(int * a, int * c, int left, int middle, int right)
{
	int i = left;
	int j = middle;
	int m = middle + 1;
	int n = right;
	int k = 0;

	while (i <= j && m <= n)
	{
		if (a[i] <= a[m])
			c[k++] = a[i++];
		else
			c[k++] = a[m++];
	}
	while (i <= j)
		c[k++] = a[i++];
	while (m <= n)
		c[k++] = a[m++];

	for (i = 0; i < k; i++)
		a[left + i] = c[i];
}
void merge(int * a, int * c, int left, int right)
{
	if (left < right)
	{
		int middle = (left + right) / 2;
		merge(a, c, left, middle);
		merge(a, c, middle + 1, right);
		mergeArray(a, c, left, middle, right);
	}
}
int main()
{
	merge(a, c, 0, len - 1);
	for (int i = 0; i < len; i++)
		cout << a[i] << " ";

	system("pause");
	return 0;
}

6、堆排序

// 建立大根堆
    void buildHeap(int *A, int n)
    {
        for(int i = n / 2; i >= 1; --i)
        {
            adjustHeap(A, i, n);
        }
    }

    // 调整堆
    void adjustHeap(int *A, int idx, int n)
    {
        int ldx = 2 * idx + 1;
        int rdx = 2 * idx + 2;
        int maxdx = idx;

        if(idx <= n / 2)
        {
            if(ldx < n && A[ldx] > A[maxdx])
            {
                maxdx = ldx;
            }

            if(rdx < n && A[rdx] > A[maxdx])
            {
                maxdx = rdx;
            }

            if(maxdx != idx)
            {
                swap(A + idx, A + maxdx);
                adjustHeap(A, maxdx, n);
            }
        }
    }

    // 堆排序
    int* heapSort(int* A, int n) {

        buildHeap(A, n);

        for(int i = n - 1;  i > -1; --i)
        {
            swap(A, A + i);
            adjustHeap(A, 0, i);
        }
        return A;
    }

  

posted @ 2018-06-30 23:21  道微真理  阅读(95)  评论(0)    收藏  举报