C++ 常见的几种排序!

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <windows.h>
using namespace std;


void sort1(int *a,int n);//我自己常写的排序
void sort2(int *a,int n);//冒泡排序
void sort3(int *a,int n);//选择排序
void sort4(int *a,int n);//插入排序
void sort5(int *a,int n);//快速排序
void show(int *a,int n)
{
 for (int j=0;j<n;j++)
 {
  cout << a[j] << " ";
 }
}
void Set(int *a,int n)
{
 for (int j=0;j<n;j++)
 {
  a[j] = n - j;

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

}      //如果第一个数大于后面的数,交换。找出最小的放在前面!

/// 冒泡
void sort2(int *a,int n)
{
 bool bswapped ;
 do
 {
  bswapped = false;
  for (int i=0;i<n-1;i++)
  {
   if (a[i]>a[i+1])
   {
    swap(a[i],a[i+1]);
    bswapped =true;
   }
  }
    
 } while (bswapped); 
}       //每一轮都要比较相邻的数据,直到没有交换为止! 效率最低
    
///  选择

void sort3(int *a,int n)
{
 for (int i=0;i<n-1;i++)
 {
  int pos = i; //记下下标
  int min = a[pos] ; //记下最小值
  for (int j=i+1;j<n;j++)
  {
   if (a[j]<min)  //如果后面还有比min小的值
   {
    pos = j;    //记下下标
    min = a[pos]; //设整个数组的最小值
   }
  }
  if (pos != i)   //如果最小值的下标变了
  {
   a[pos] = a[i];
   a[i] = min;   //交换2个数的值
  } 
 }

           //先假定第一个数是最小的,然后找出后面比他小的数记下下标
/// 插入

void sort4(int *a,int n)
{
 for ( int i=1;i<n;i++)   //从第二个元素开始  第一个已经排好!
 {
  int cur = a[i];  
  for (int j=i;j>0 && a[j-1] >cur ;j--)  //从已经排好的数列中的最后一个位置向前//直到确定正确的位置
  {
   a[j] = a[j-1];     //腾出空间  向后挪一个位置
   if (j!=i)
   {
    a[j] =cur;                  //把待插入的数据放在正确的位置
   }
  }
 }

}

快速


void Swap(int *a,int *b)
{
 int c =*a;
 *a = *b;
 *b = c;
}

void sort5(int *a,int n)
{
 if (n<=1)
 {
  return;
 }
 Swap(a,a+(n/2));  //把中间的数放到第一个去了
 int num = *a;
 int *L = a + 1;  //从第二个数开始
 int *R = a + n -1; // 从最后一个数开始
 while (L<R)
 {
  while (L<R&& *L < num) L++;  //左边比num小 跳过
  while (R>=L && *R >= num ) R--; //右边比num大 跳过
  if (L<R)
  {
   Swap(L,R);  //交换数据 使得比num小的在左边
  }  
 }
 if (*R < num) 
 {
  Swap(a,R);  //把分界值换回来
 }
 sort5(a,R-a);
 sort5(R+1,n-(R-a)-1);
}
  // 把一个数组分成2部分,把大于分界值的数据集中到一边,不小于的集中到一边,然后递归!
//


int main()
{
 const int max = 10000;
 int a[max];
 Set(a,max);
 DWORD  p = GetTickCount();
 sort5(a,max);
 DWORD  q = GetTickCount() -p;
 cout << q << endl;
// show(a,max);
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值