1.快速排序

  实现:

    1.取中间一个数作为支点

    2.分别在支点的左右两边进行查找,如果左边查找到比支点大,右边查找到比支点小,就交换位置,如此循环,比支点小的数就排在了左边,比支点大的就排在右边

    3.左右两边再用递归排序,就可以完成排序操作

    

/**
*@brief 快速排序
*@params arr 数组 left 起始位置 right总点位置
*/
void quickSort(int arr[],int left,int right)
{
int i = left;
int j = right;
int pivot = arr[(left + right) / ]; // 支点
while(i <= j)
{
while(arr[i] < pivot)
{
i++;
} while(arr[j] > pivot)
{
j--;
} if(i<=j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
} // 递归
if(left < j)
{
quickSort(arr,left,j);
} if(i < right)
{
quickSort(arr,i,right);
}
}

2.冒泡排序

  原理:如果当前这个数比下一个数大,则交换位置,经过一次之后最大的数就排到了数组的末尾,以此类推

void bubble(inti arr[],int n)
{
int i ;
int temp;
for(i=;i<n-;i++)
{
if(arr[i] > arr[i + ])
{
temp = arr[i];
arr[i] = arr[i + ];
arr[i + ] = temp;
}
} } void bubbleSort(int arr[],int n)
{
int i;
for(i = n; i>=; i--)
{
bubble(arr,i);
}
}

3.选择排序

  思路:

    1.首先在数组中找到最大值并记录其下标

    2.然后最大值与数组下标为n-1的交换。

int findMaxPos(int arr[],int n)
{
int i;
int max = arr[];
int pos = ;
for(int i = ; i<n; i++)
{
if(arr[i] > max)
{
pos = i;
max = arr[i];
}
}
return pos;
} void selectSort(int arr[],int n)
{
while(n > )
{
int pos = findMaxPos(arr,n);
int temp = arr[pos];
arr[pos] = arr[n - ];
arr[n - ] = temp;
n--;
}
}

4.插入排序

  思路:

  1.首要条件:两个数及以上

  2.取到当前要插入的元素,以前面一个比较,如果小于前面,则需要把前面的大数移位,直到不满足小于的条件,插入相应的位置

void insert(int arr[],int n)
{
int key = arr[n];
int i = n;
while(arr[i - ] > key)
{
arr[i] = arr[i - ];
i--;
if(i == )
{
break;
}
}
arr[i] = key;
} void insertionSort(int arr[],int n)
{
int i;
for(i=; i< n; i++)
{
insert(arr,i);
}
}

5.二分查找插入排序

/*
* 折半查找排序
* 思路:
* 1.直接插入排序中,通过二分查找待插入的位置pos
* 2.将pos + 1 到 i - 1元素往后移动一个位置
* 3.将带排序的元素复制到pos
*/ // 二分查找
/*
* 如查找的数组是: a[4] =[3,2,1,4] maxLength = 4 key对应数组下标的值;
* 第一次查找:pos = 0
* 第二次查找:pos = 1
* 第三次查找:pos = 2
* 第四次查找:
*/
int findPos(int a[],int maxLength,int key)
{
int i = , low =, hight = current - ,pos;
while(low <= hight)
{
pos = (low + hight) / ;
if(a[pos] > key){ // 向左边查找
hight = pos - ;
}else{
low = pos + ;
}else{
return pos; // 返回查找到的位置
} return -; // 没有找到
} // 插入排序
void binInsertSort(int a[])
{
int i = , temp,pos,j;
for(i = ; i<a.count; i++)
{
pos = findPos(a,i,a[i]);
temp = a[i];
for(j = i -;j >= pos;j--)
{
a[j + ] = a[j]; // 元素后移
}
a[pos] = temp;
}
}

6.归并排序

  思路:就是将两个已经排好序的数组,合成一个排好序的数组

  1.先把数组中单个元素看做是已经排好序的堆

  2.合并两个相邻的堆,重复多次,就之后剩下两个在进行合并

int *sort(int a[],int b[])
{
int maxLength = a.length + b.length
int temp[maxLength]; int ai = ;
int bi = ;
int tempi = ;
while(ai < a.length && bi <b.length)
{
if(a[ai] < b[bi])
{
temp[tempi++] = a[ai++];
}
else{
temp[tempi++] = b[bi++];
}
} // 判断那个数组最长,把长出来的继续添加到temp数组中
while(ai < a.length) temp[tempi++] = a[ai++];
while(bi < b.length) temp[tempi++] = b[bi++]; return temp;
}

7.堆排序

  思路:

  1.先把要排序的数组如a[9]={20,50,20,40,70,10,80,30,60},构造堆(有大顶堆和小顶堆)

  在构造有序堆时,我们开始只需要扫描一半的元素(n/2-1 ~ 0)即可,为什么?
  因为(n/2-1)~0的节点才有子节点,如图1,n=8,(n/2-1) = 3 即3 2 1 0这个四个节点才有子节点

  2.筛选

  3.调整堆    private static void heapSort(int[] arr) {

int len = arr.length -1;
for(int i = len/2 - 1; i >=0; i --){ //堆构造
heapAdjust(arr,i,len);
}      // 执行到这里,说明根节点(a[0])是最大值或者是最小值了
while (len >=0){
swap(arr,0,len--); //将堆顶元素与尾节点交换后,长度减1,尾元素最大
heapAdjust(arr,0,len); //再次对堆进行调整
}
} public static void heapAdjust(int[] arr,int i,int len){
int left,right,j ;
while((left = 2*i+1) <= len){ //判断当前父节点有无左节点(即有无孩子节点,left为左节点)
right = left + 1; //右节点或者写 2*i+2
j = left; //j"指针指向左节点"
if(j < len && arr[left] < arr[right]) //右节点大于左节点
j ++; //当前把"指针"指向右节点
if(arr[i] < arr[j]) //将父节点与孩子节点交换(如果上面if为真,则arr[j]为右节点,如果为假arr[j]则为左节点)
swap(arr,i,j);
else //说明比孩子节点都大,直接跳出循环语句
break;
i = j;
}
}
public static void swap(int[] arr,int i,int len){
int temp = arr[i];
arr[i] = arr[len];
arr[len] = temp;
}

第四篇、C_快速、冒泡、选择、插入排序、二分查找排序、归并、堆排序的更多相关文章

  1. 常见的排序算法(直接插入&选择排序&二分查找排序)

    1.直接插入排序算法 源码: package com.DiYiZhang;/* 插入排序算法 * 如下进行的是插入,排序算法*/ public class InsertionSort {    pub ...

  2. IOS- 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序

    /*******************************快速排序 start**********************************///随即取 当前取第一个,首先找到第一个的位置 ...

  3. 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  4. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  5. 第四篇 Integration Services:增量加载-Updating Rows

    本篇文章是Integration Services系列的第四篇,详细内容请参考原文. 回顾增量加载记住,在SSIS增量加载有三个使用案例:1.New rows-add rows to the dest ...

  6. 直接插入排序、折半插入排序、Shell排序、冒泡排序,选择排序

    一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2).空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; ...

  7. 【译】第四篇 Integration Services:增量加载-Updating Rows

    本篇文章是Integration Services系列的第四篇,详细内容请参考原文. 回顾增量加载记住,在SSIS增量加载有三个使用案例:1.New rows-add rows to the dest ...

  8. Spring Cloud第十四篇 | Api网关Zuul

    ​ 本文是Spring Cloud专栏的第十四篇文章,了解前十三篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring C ...

  9. [PHP]基本排序(冒泡排序、快速排序、选择排序、插入排序、二分法排序)

    冒泡排序: function bubbleSort($array){ $len=count($array); //该层循环控制 需要冒泡的轮数 for($i=1;$i<$len;$i++){ / ...

随机推荐

  1. 将Sublime Text 2搭建成一个好用的IDE

    将Sublime Text 2搭建成一个好用的IDE 说起编辑器,可能大部分人要推荐的是Vim和Emacs,本人用过Vim,功能确实强大,但是不是很习惯,之前一直有朋友推荐SUblime Text 2 ...

  2. SecureCRT配置显示的字符集

  3. 射频识别技术漫谈(6)——通讯协议概述【worldsing笔记】

    通讯协议是通讯的双方或多方在交流时遵守的规矩,包括谁先发起通讯,先交流什么,后交流什么,一方如何问,另一方如何答等.在这里通迅的双方指的是读写器和卡片. 首先是谁先发起通讯,很显然有两种,读写器先发言 ...

  4. prestashop二次开发 笔记(支付插件)

    //主函数 public function __construct() { $this->name = 'CilPay';    //模块名称         $this->display ...

  5. 1000万条数据导入mysql

    今天需要将一个含有1000万条数据的文本内容插入到数据库表中,最初自然想到的是使用Insertinto '表名'values(),(),()...这种插入方式,但是发现这种方式对1000万条数据量的情 ...

  6. (二)Bootstrap CSS 概览

    在这一章中,我们将讲解 Bootstrap 底层结构的关键部分,包括我们让 web 开发变得更好.更快.更强壮的最佳实践. HTML 5 文档类型(Doctype) Bootstrap 使用了一些 H ...

  7. 【C++深入浅出】设计模式学习之简单工厂

    看大话设计模式中大牛对小菜的精辟点评,也写了一个计算器程序,并跟着点评一路改良,还是不过瘾,应用了类模板和异常捕捉机制重写了程序. 本文不能算干货,恰当的比方是饭前甜点,吃一口有点味.有点意思,总归太 ...

  8. C#.NET数据库访问类DBHelper

    这是一个与C# .NET通用的数据库访问类,包含了工厂模式.事务处理等安全机制. 调用方式: DBHelper db = new DBHelper(); DbCommand cmd = db.GetS ...

  9. 关于expanded一级二级菜单数据的分组排序

    最新再弄关于expandedlistview相关的东西,所以需求是需要对一级菜单根据时间排序,同时二级菜单也需要根据时间排序,距离现在最近的时间显示在最前面. 效果就是如下: --group2  -- ...

  10. p2p項目”復活“之想

    http://blog.csdn.net/christopherwu/article/details/23976503 原來以為p2p項目就要夭折,墮入絕望無奈的深淵之時,與多位朋友的交流,抬頭看見了 ...