算法复习--排序


排序中主要有插入排序、冒泡排序、归并排序、快速排序等

主要从空间消耗、时间复杂度、最差时间复杂度等方面考虑算法的好处;

1.插入排序

插入排序是一种简单直观的排序算法。它的工作原理非常类似于我们抓扑克牌

      

 

  对于未排序数据(右手抓到的牌),在已排序序列(左手已经排好序的手牌)中从后向前扫描,找到相应位置并插入。

  插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

    int A[] = { 6, 5, 3, 1, 8, 7, 2, 4 };// 从小到大插入排序
    int n = sizeof(A) / sizeof(int);
    int i, j, get;

    for (i = 1; i < n; i++)             // 类似抓扑克牌排序
    {
        get = A[i];                     // 右手抓到一张扑克牌
        j = i - 1;                      // 拿在左手上的牌总是排序好的
        while (j >= 0 && A[j] > get)    // 将抓到的牌与手牌从右向左进行比较
        {
            A[j + 1] = A[j];            // 如果该手牌比抓到的牌大,就将其右移
            j--;
        }
        A[j + 1] = get;// 直到该手牌比抓到的牌小(或二者相等),将抓到的牌插入到该手牌右边(相等元素的相对次序未变,所以插入排序是稳定的)
    }

2.冒泡排序

 int a[10]={13,2,5,18,7,12,9,10,15,6};  
  
 for(int i=0;i<10;i++)  
  
  for(int j=9;j>=i;j--)  
  
  {  
  
   num++;  
  
   if (a[j]<a[j-1])  
  
   {  
  
    temp=a[j];  
  
    a[j]=a[j-1];  
  
    a[j-1]=temp;  
  
   }  
  
  } 
3.归并排序

#include "stdafx.h"
#include <iostream>
#include<conio.h>
using namespace std;

//将数组 a[low,mid] 与 a(mid,high] 合并(归并)
void Merge(int * a, int low, int mid, int high, int * temp)
{
	int i, j, k;
	i = low;
	j = mid + 1;//避免重复比较a[mid]
	k = 0;
	while (i <= mid && j <= high)//数组a[low,mid]与数组(mid,high]均没有全部归入数组temp中去
	{
		if (a[i] <=a[j])        //如果a[i]小于等于a[j]
			temp[k++] = a[i++]; //则将a[i]的值赋给temp[k],之后i,k各加一,表示后移一位
		else
			temp[k++] = a[j++]; //否则,将a[j]的值赋给temp[k],j,k各加一
	}
	while (i <=mid)             //表示数组a(mid,high]已经全部归入temp数组中去了,而数组a[low,mid]还有剩余
		temp[k++] = a[i++];     //将数组a[low,mid]剩下的值,逐一归入数组temp
	while (j <=high)           //表示数组a[low,mid]已经全部归入到temp数组中去了,而数组(mid,high]还有剩余
		temp[k++] = a[j++];     //将数组a(mid,high]剩下的值,逐一归入数组temp

	for (i = 0; i < k; i++)     //将归并后的数组的值逐一赋给数组a[low,high]
		a[low + i] = temp[i];     //注意,应从a[low+i]开始赋值
}

//二路归并(递归实现)
void MergeSort(int * a, int low, int high, int * temp)
{
	if (low < high)
	{
		int mid = (low + high) / 2;
		MergeSort(a, low, mid, temp);      //左边有序
		MergeSort(a, mid + 1, high, temp);   //右边有序
		Merge(a, low, mid, high, temp);     //再将两个有序序列合并
	}
}

/*----------测试代码----------*/
int main()
{
	int a[] = { 2,2356,54,43,45};
	int La = sizeof(a) / sizeof(a[0]);
	int * p = new int[La];
	MergeSort(a, 0, La - 1, p);
	for (int i = 0; i < La; i++)
	{
		cout << a[i] << ' ';
	}
	cout << endl;
	_getch();
	//delete[]p;
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值