数据结构:排序算法之交换排序(冒泡排序、快速排序)

1、冒泡

void bubbleSort(int a[], int n){for(int i =0 ; i< n-1; ++i) {for(int j = 0; j < n-i-1; ++j) {if(a[j] > a[j+1]){int tmp = a[j] ; a[j] = a[j+1] ;  a[j+1] = tmp;}}}
}/*1.设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可。
改进后算法如下:
*/
void Bubble_1 ( int r[], int n) {int i= n -1;  //初始时,最后位置保持不变while ( i> 0) { int pos= 0; //每趟开始时,无记录交换for (int j= 0; j< i; j++)if (r[j]> r[j+1]) {pos= j; //记录交换的位置 int tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp;} i= pos; //为下一趟排序作准备} 
}/*2.传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。
改进后的算法实现为:
*/
void Bubble_2 ( int r[], int n){int low = 0; int high= n -1; //设置变量的初始值int tmp,j;while (low < high) {for (j= low; j< high; ++j) //正向冒泡,找到最大者if (r[j]> r[j+1]) {tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp;} --high;					//修改high值, 前移一位for ( j=high; j>low; --j) //反向冒泡,找到最小者if (r[j]<r[j-1]) {tmp = r[j]; r[j]=r[j-1];r[j-1]=tmp;}++low;					//修改low值,后移一位} 
}


2、快速排序

#include <iostream>
#include <stack>
using namespace std;int GetKeyIndex(int array[], int left, int right)
{int mid = left + ((right - left)>>1);if(array[left] < array[right]){if(array[mid] < array[left])return left;if(array[mid] > array[right])return right;elsereturn mid;}else{if(array[mid] < array[right])return right;else if(array[mid] > array[left])return left;elsereturn mid;}
}int partion(int array[], int left, int right)
{int begin = left;int end = right-1;//三个数取中间int keyIndex = GetKeyIndex(array, left, right);if(keyIndex != right){std::swap(array[keyIndex], array[right]);}int key = array[right];while( begin < end ){while( begin < end && array[begin] <= key)begin++;while( begin < end && array[end] > key)end--;if(begin < end){std::swap(array[begin], array[end]);begin++;}}if(begin != right && array[begin] > array [right]){swap(array[begin], array [right]);return begin;}return right;
}void QuickSort(int array[], int left, int right)
{if(left < right){int div = partion(array, left, right);QuickSort(array, left, div - 1);QuickSort(array, div + 1, right);}
}/*int partion2(int array[], int left, int right)
{int begin = left;int end = right;三个数取中间//int keyIndex = GetKeyIndex(array, left, right);//if(keyIndex != right)//{//	std::swap(array[keyIndex], right);//}int key = array[right];while( begin < end ){while( begin < end && array[begin] <= key)begin++;std::swap(array[begin], array[end]);while( begin < end && array[end] > key)end--;std::swap(array[begin], array[end]);}return begin;
}void QuickSort(int array[], int left, int right)
{if(left < right){int div = partion2(array, left, right);QuickSort(array, left, div - 1);QuickSort(array, div + 1, right);}
}int partion3(int array[], int left, int right)
{int begin = left;int end = right;int key = array[left];while( begin < end ){while( begin < end && array[end] >= key)end--;if(begin < end){array[begin] = array[end];begin++;}while( begin < end && array[begin] <= key)begin++;if(begin < end){array[end] = array[begin];end--;}}array[begin] = key;return begin;
}void QuickSort(int array[], int left, int right)
{if(left < right){int div = partion3(array, left, right);QuickSort(array, left, div - 1);QuickSort(array, div + 1, right);}
}int partion4(int array[], int left, int right)
{int Cur = left;int Prev = Cur - 1;int key = array[right];while(Cur <= right){if(array[Cur] < key && ++Prev != Cur)std::swap(array[Prev], array[Cur]);++Cur;}std::swap(array[++Prev], array[right]);return Prev;
}void QuickSort(int array[], int left, int right)
{if(left < right){int div = partion4(array, left, right);QuickSort(array, left, div - 1);QuickSort(array, div + 1, right);}
}void QuickSort_nor(int *array, int size)
{stack<int> s;s.push(size-1);s.push(0);while(!s.empty()){int left = s.top();s.pop();int right = s.top();s.pop();if(left < right){int div = partion3(array, left, right);s.push(right);s.push(div +1);s.push(div -1);s.push(left);}}
}
*/ 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验3 --俄罗斯方块 with 20135335郝爽

一、 实验内容 &#xff08;一&#xff09;敏捷开发与XP 内容&#xff1a;1.敏捷开发&#xff08;Agile Development&#xff09;是一种以人为核心、迭代、循序渐进的开发方法。 2.极限编程(eXtreme Programming&#xff0c;XP)是一种全新而快捷的软件开发方法。 要点&#x…

2015年总结2016展望

2015感觉过的很快&#xff0c;非常充实。一直在忙着不是写这就是写那。反正是没有闲过。 家庭更和睦&#xff0c;孩子也大了一岁&#xff0c;活泼可爱&#xff0c;父母身体也还可以&#xff0c;经济增长和2014差不多。 15年最大的事就是项目T算是成功运转了&#xff0c;14年废了…

birt插件 web_Maven方式集成BIRT 4.6 Webviewer

平生从未见过如此糟糕的官方maven发布质量&#xff0c;窃以为是公司只想卖商业版本&#xff0c;对应的开源版本BIRT简直就是抱来养的。为了顺利集成BIRT&#xff0c;采用两步走方式&#xff1a;以eclipse的能运行版本为比较基础&#xff0c;再使用maven方式集成验证。传统动态w…

八大排序算法:插入(2:插入、希尔)、选择(2:选择、堆)、交换(2:冒泡、快速)、归并、基数

八大排序算法 发表于2012/7/23 16:45:18 662397人阅读 分类&#xff1a; c/c 数据结构与算法 概述 排序有内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排…

Active Record 数据库迁移总结

占位符!转载于:https://www.cnblogs.com/mahong-shaojiu-ruby/p/5098150.html

cm0中断优先级_转:第13章 FreeRTOS任务优先级修改及其分配方案

FreeRTOS的配置&#xff1a;FreeRTOSConfig.h文件中的配置如下&#xff1a;/* Ensure stdint is only used by the compiler, and not the assembler. */#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)#include extern volatile uint32_t ulHighFrequency…

网页图表Highcharts实践教程之标签组与载入动画

网页图表Highcharts实践教程之标签组与载入动画 Highcharts标签组 在图表的大部分元素都提供了标签功能。但很多时候&#xff0c;我们需要额外说明一些信息。这个时候借助原有的图表元素的标签功能就不是很方便。Highcharts为用户提供了标签组功能。使用该功能可以在图表区的任…

有趣的C语言面试题

1、gets() 和 fgets()函数 问题&#xff1a;找出下面代码的问题 #include<stdio.h> int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets(buff); printf("\n The buffer entered is [%s]\n",buff); return 0; }答&#xff1a;上面代码里的…

Android 4.4 Kitkat Phone工作流程浅析(八)__Phone状态分析

本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处本文代码以MTK平台Android 4.4为分析对象。与Google原生AOSP有些许差异。请读者知悉。前置文章&#xff1a; 《Android 4.4 Kitkat Phone工作流程浅析(一)__概要和学习计划》《Android 4.4 Kitkat Phone工作流程浅…

米家对讲机_对前面两代产品不断总结和完善的产物,米家对讲机2代开箱体验...

4月1日&#xff0c;小米终于发布了旗下对讲机产品的2代&#xff1a;米家对讲机2。憋了两年后&#xff0c;可见米家对讲机团队针对前期米家对讲机一代以及1S很多用户反应的问题还是非常重视的&#xff0c;所以这次的米家对讲机2代基本上改进了前期存在的不足&#xff0c;补齐了前…

【MFC】vs2013_MFC使用文件之15.mfc 按钮CBitmapButton的使用

本文是基于对话框的 博文基于 无幻 的博文为基础写的 http://blog.csdn.net/akof1314/article/details/4951836 笔者使用mfc撑死2个星期&#xff0c;不过这是有c基础的前提下接触mfc&#xff0c;昨天看到了网上对qt creator的评论&#xff0c;感觉好高大上&#xff0c;回去试了…

C语言存储空间布局以及static解析

本文我将采用Linux环境测试C语言存储空间布局&#xff0c;以及采用VC6.0来测试static的常见用法。采用linux环境来测试c语言存储空间布局&#xff0c;是因为Linux很容易利用shell命令中的size命令查看到进程存储区各段的大小。采用VC6.0来测试static的常见用法&#xff0c;是因…

老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列...

老李推荐&#xff1a;第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后&#xff0c;会把这些事件排队放入一个由事件源维护的队列&#xff0c;然后其他地方如Monkey类的runMonkeyCycles方法…

swift 打包sdk_在封装SDK中Swift和OC混编之相互调用

oc和swift混编之相互调用.jpg在非SDK中&#xff1a;1、swift调用oc步骤&#xff1a;创建 工程名-Bridging-Header.h放入oc的头文件&#xff0c;swift即可调用在swift项目中或者在oc项目中&#xff0c;创建oc或者swift文件&#xff0c;Xcode都会提示问你是否要创建桥接文件&…

网络上常用的一些网站

域名查询 Whois 查询 站长工具 http://whois.chinaz.com/ 是用来查询域名的IP以及所有者等信息的传输协议。简单说&#xff0c;whois就是一个用来查询域名是否已经被注册&#xff0c;以及注册域名的详细信息的数据库&#xff08;如域名所有人、域名注册商&#xff09;。通过…

字符串替换:用参数字符数组成员替换字符串中的占位符(面试题)

1、问题描述&#xff1a; 请你实现一个简单的字符串替换函数。原串中需要替换的占位符为"%s",请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。 则将剩下的参数字符添加到字符串的结尾。给定一个字符串A&#xff0c;同时给定它的长度n及参数…

华为手机怎么设置应用不全屏显示_手机投屏智能电视画面比例不合适怎么办?...

手机投屏到电视的比例不对怎么办知乎上有网友私下&#xff1a;“苹果手机屏幕镜像投屏到电视上&#xff0c;画面不能全屏&#xff0c;然后在网上查了一下是因为显示比例的问题&#xff0c;请问怎么解决&#xff1f;”这个问题说简单也简单&#xff0c;说难也难。说简单是因为想…

bootstrap精简教程

bootstrap 的学习非常简单&#xff0c;并且它所提供的样式又非常精美。只要稍微简单的学习就可以制作出漂亮的页面。 bootstrap中文网&#xff1a;http://v3.bootcss.com/ bootstrap提供了三种类型的下载&#xff1a; 1、用于生产环境的bootstrap 编译并压缩后的CSS、JavaScri…

群晖docker安装cms_Nas码农篇:群晖Docker安装Gitlab

Git大多数码农来说都很熟悉&#xff0c;团队协作开发必备。今天来分享下在群晖Docker上安装gitlab。群晖上安装gitlab有两种方式&#xff0c;一种是直接安装套件中心的gitlab&#xff0c;另一种是在docker中自定义安装。我们这里选择后者&#xff0c;因为这种方式可以安装最新版…

微信红包问题:找出某个出现次数超过红包总数一半的红包的金额(面试题)

1、问题描述 春节期间小明使用微信收到很多个红包&#xff0c;非常开心。在查看领取红包记录时发现&#xff0c;某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现&#xff0c;要求算法尽可能高效。 给定一个红包的金额数组gif…