关于快速,冒泡,选择,插入等排序,本人用代码实现,均能运行成功。

本文除了排序,针对几种swap函数,也进行了说明,通过汇编代码分析,swap1函数的效率最高。

#include<iostream>
#include <cstdio>

/*交换函数*/
void swap1(int *a,int *b){
  int tmp = *a;
  *a = *b;
  *b = tmp;
}

/**
*swap2和swap3针对同一个变量,会导致这个变量为0
*因为两个指针指向同一个变量。
*/
void swap2(int *a,int *b)
{
  *a = *a ^ *b;
  *b = *a ^ *b; //*a ^ *b ^ *b -> *a
  *a = *a ^ *b; //*a ^ *b ^ *a -> *b
}

void swap3(int *a,int *b)
{
  *a = *a + *b;
  *b = *a - *b;
  *a = *a - *b;
}

void swap3(int &a,int &b){
  printf("swap3:%d,%d\n",a,b);
  a = a + b;
  b = a - b;
  a = a - b;
  printf("swap3 end:%d,%d\n",a,b);
}

/*快速排序*/
//不稳定,时间复杂度O(logN) - O(N) 空间复杂度O(1)
void quicksort(int *a,int low,int high)
{

  int i = low;
  int j = high;
  int key = a[low];
  if(low >= high){
  return;
  }
  while(low < high){
    while(low<high && key <= a[high]){
      --high;
    }

    if(key > a[high]){
      swap2(&a[low], &a[high]);//交换最低位与最高位置得数据
      ++low;
    }

    while(low <high && key >= a[low] ){
      ++low;
    }

    if(key < a[low]){
      swap2(&a[low], &a[high]);
      --high;
    }
    }
    quicksort(a,i,low-1);
    quicksort(a,low+1,j);
}

/*冒泡排序*/
//稳定,最坏O(N^2) 最好O(N) 空间复杂度O(1)
void maopaoSort(int *a,int size)
{
  int j,i;
  for(i=0;i<size;++i){
    for(j=i+1;j<size;++j){
      if(a[j] > a[i]){
        swap2(&a[j],&a[i]);
      }
     }
  }
}

/*插入排序*/
//稳定,最坏O(N^2) 最好O(N)
void insertSort(int nums[],int size)
{
  int i,j;
  for(i=1;i<size;++i){
    int n = nums[i];
    j = i-1;
    while(j>=0&&n>=nums[j]){
      nums[j+1] = nums[j];
      --j;
    }
    nums[j+1] = n;
  }
}

/*选择排序*/
//不稳定,最坏O(N^2) 最好O(N)
void selectSort(int *nums,int size)
{
  int i = 0,j =0;
  int index = 0;
  for(i=0;i<size-1;++i){
    index = i;
    for(j=i+1;j<size;++j){
      if(nums[index] < nums[j]){
        index = j;
      }
    }
    if(index != i)
     swap3(nums[index],nums[i]);//使用的是重载的引用类型
  }
}

void show(int *a,int size)
{
  std::cout<<"show:"<<std::endl;
  for(int i=0;i<size;++i){
    std::cout<<a[i]<<" ";
  }
  std::cout<<std::endl;
}

int main()
{
  int arra[] = {100,2,10,11,9,-1000};
  int size = sizeof(arra)/sizeof(arra[0]);
  printf("sort start:\n");
  show(arra, size);
  selectSort(arra,size);
  printf("sort end:\n");
  show(arra, size);
}

c语言排序代码实现的更多相关文章

  1. Javascript 语言精粹 代码片段合集

    Javascript 语言精粹 代码片段合集 标签:Douglas-Crockford Javascript 最佳实践 原文链接 更好的阅读体验 使用一个method 方法定义新方法 Function ...

  2. C语言初学者代码中的常见错误与瑕疵(23)

    见:C语言初学者代码中的常见错误与瑕疵(23)

  3. C语言混乱代码大赛

    main() {printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0 ...

  4. 一个超复杂的间接递归——C语言初学者代码中的常见错误与瑕疵(6)

    问题: 问题出处见 C语言初学者代码中的常见错误与瑕疵(5) . 在该文的最后,曾提到完成的代码还有进一步改进的余地.本文完成了这个改进.所以本文讨论的并不是初学者代码中的常见错误与瑕疵,而是对我自己 ...

  5. C语言初学者代码中的常见错误与瑕疵(5)

    问题: 素数 在世博园某信息通信馆中,游客可利用手机等终端参与互动小游戏,与虚拟人物Kr. Kong 进行猜数比赛. 当屏幕出现一个整数X时,若你能比Kr. Kong更快的发出最接近它的素数答案,你将 ...

  6. C语言初学者代码中的常见错误与瑕疵(19)

    见:C语言初学者代码中的常见错误与瑕疵(19)

  7. C语言初学者代码中的常见错误与瑕疵(14)

    见:C语言初学者代码中的常见错误与瑕疵(14) 相关链接:http://www.anycodex.com/blog/?p=87

  8. 分数的加减法——C语言初学者代码中的常见错误与瑕疵(12)

    前文链接:分数的加减法——C语言初学者代码中的常见错误与瑕疵(11) 重构 题目的修正 我抛弃了原题中“其中a, b, c, d是一个0-9的整数”这样的前提条件,因为这种限制毫无必要.只假设a, b ...

  9. C语言初学者代码中的常见错误与瑕疵(9)

    题目 字母的个数 现在给你一个由小写字母组成字符串,要你找出字符串中出现次数最多的字母,如果出现次数最多字母有多个那么输出最小的那个. 输入:第一行输入一个正整数T(0<T<25) 随后T ...

随机推荐

  1. delphi 不规则窗体与桌面宠物

    二.支持区域操作的编程接口在Windows的API函数中有一组用于区域操作的函数,可以用来生成区域.合并区域.获取区域数据.根据数据生成区域.把区域和窗体联系等,其中常用的几个函数有:生成矩形区域的C ...

  2. NOIp2018集训test-9-2(pm)

    其实这套题我爆0了,T1define 写成ddefine编译错误 T2有两个变量爆int 但是我看zwh不在悄悄地改了,我心里还是十分愧疚(没有)的.主要是林巨已经虐我125了要是再虐我200分我大概 ...

  3. (转)mysql分区技术2

    转:http://database.51cto.com/art/201002/184392.htm 非整数列分区 任何使用过分区的人应该都遇到过不少问题,特别是面对非整数列分区时,MySQL 5.1只 ...

  4. PyTorch常用函数总结

    将一个tensor分到多个GPU上:torch.cuda.comm.scatter

  5. Dll注入技术之ComRes注入

    DLL注入技术之ComRes注入 ComRes注入的原理是利用Windows 系统中C:\WINDOWS\system32目录下的ComRes.dll这个文件,当待注入EXE如果使用CoCreateI ...

  6. DLL注入技术之依赖可信进程注入

    DLL注入技术之依赖可信进程注入 依赖可信进程注入原理是利用Windows 系统中Services.exe这个权限较高的进程,首先将a.dll远线程注入到Services.exe中,再利用a.dll将 ...

  7. [转]C++的Json解析库:jsoncpp和boost

    JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...

  8. class13and14and15_登录窗口

    最终的运行效果图(程序见序号6.2): #!/usr/bin/env python# -*- coding:utf-8 -*-# ----------------------------------- ...

  9. scala容器对象(转载)

    1Array 数组 Scala的数组是这个样子: val arr = new Array[String](3) 程序员们基本都看得懂,new 一个Array对象,它的类型是String,长度为3.对元 ...

  10. Landsat数据下载与介绍

    1 数据下载 根据时间选择不同的Landsat卫星传感器 根据经纬度选择对应的条带: Lansdat Analysis Ready Data (ARD) Tile Conversion Tool: 把 ...