版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/caihongshijie6/article/details/26165093

       事实上,在ACM比赛时,非常少人会自己去写寻常时的那种排序算法。都是直接使用库函数里面的排序算法。可是表示或者是面试的时候一般会问道这些主要的算法。

所以今天就把排序算法发整理了一下。也在OJ上找了几道简单题来验证一下。

如今把当中主要的排序算法整理例如以下(临时还没有将堆排序的实现贴上来):

/*
* nefu_sort.cpp
*
* Created on: 2014年5月18日
* Author: pc
*/ #include <iostream>
#include <cstdio> using namespace std; int n; /**
* 第一种交换算法:
* 借助中间变量
*/
void swap1(int arr[],int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
} /**
* 另外一种交换算法:
* 不借助中间变量,使用算术运算
*/
void swap2(int arr[],int i, int j){
arr[i] = arr[i] + arr[j];
arr[j] = arr[i] - arr[j];
arr[i] = arr[i] - arr[j];
} /**
* 第三种交换算法:
* 使用位运算
*/
void swap3(int arr[], int i, int j){
arr[i] = arr[i]^arr[j];
arr[j] = arr[i]^arr[j];
arr[i] = arr[i]^arr[j];
} /**
* 冒泡排序的第一种方式:
* 标准方式
*/
void bubblesort1(int arr[],int n){
int i;
int j;
for(i = 0 ; i < n-1 ;++i){//循环n-1次(由于1个数默觉得有序的状态),每次能是一个数达到有序状态
for(j = 0 ; j < n-i-1 ; ++j){//每次将从第一个数到有序状态之前的数进行比較(有序状态以后的数不再须要进行比較)
if(arr[j] > arr[j+1]){//假设前面的数大于后面的数
swap3(arr,j,j+1);//则进行交换
}
}
}
} /**
* 冒泡排序的另外一种方式:採用"扫描一遍以后,假如没有发生交换,即是达到了有序状态"的特点进行优化
*/
void bubblesort2(int arr[],int n){
int k = n;
bool flag = true;
while(flag){
flag = false;
for(int j = 0 ; j < k-1 ; ++j){
if(arr[j] > arr[j+1]){
swap3(arr,j,j+1);
flag = true;//用来标记这一次是否发生了交换
}
}
--k;
}
} /**
* 冒泡排序的第三种方式:在另外一种的基础上,用于处理"假如有100个数据,假如后90个都已经有序的情况"
*/
void bubblesort3(int arr[],int n){
int k;
int flag = n;
while(flag > 0){
k = flag;
flag = 0;
for(int j = 1 ; j < k ; ++j){
if(arr[j-1] > arr[j]){
swap3(arr,j-1,j);
flag = j;//对方式2的改进...用来标记发生交换的是哪一个位置
}
}
}
} void insertsort1(int arr[], int n){
int i;
for(i = 1 ; i < n ; ++i){//当仅仅有一个数的时候默认是有序的,所以从第二个位置上開始考虑
int j;
for(j = i-1 ; j >= 0 ; --j){//从当前位置往前找合适的位置
if(arr[j] < arr[i]){
break;
}
} if(j != i-1){//假设找到了合适的位置...假设j=i-1,则说明[0-i]都是有序的 int temp = arr[i];//保存当前位置的数
int k;
for(k = i-1 ; k > j ; --k){//将i-1位置到j位置上的书往后移
arr[k+1] = arr[k];
} arr[k+1] = temp;//将原来i位置上的数放到j位置后面
}
}
} void insertsort2(int arr[],int n){
int i;
for(i = 1 ; i < n ; ++i){//从第二个位上開始扫
if(arr[i-1] > arr[i]){//假设找到一个位置,他的后面一个数要比他的前面一个数小
int j;
int temp = arr[i];//将当前位置上的数保存
for(j = i-1 ; j >= 0 && arr[j] > temp ; --j){//将i-1位置及之前的比arr[i]大的数都往后移一位
arr[j+1] = arr[j];
} arr[j+1] = temp;//将arr[i]插入到从后面数比arr[i]小的第一个数的后面
}
}
} /**
* 希尔排序中的插入的逻辑部分
*/
void shellinsert(int arr[],int d , int n){
int i;
for(i = d ; i < n ; ++i){//循环遍历依据步长分成的组.(步长为n。就分成了n个组) int temp = arr[i];//保存当前位置的值
int j;
for(j = i-d ; j>= 0 && arr[j] > temp ; j -= d){//寻找合适的位置.从后往前找,找到那个比当前位置的数小的位置
arr[j+d] = arr[j];//将找到的位置后面的书都往后移
} if(j != i-d){//假设找到了合适的位置
arr[j+d] = temp;//将当前位置的数放到合适的位置
}
}
} /**
* 希尔排序
*/
void shellsort(int arr[],int n){
int d = n/2;//设置初始步长
while(d>=1){
shellinsert(arr,d,n);//将整个序列划分成若干个子序列,对子序列运行插入排序
d /= 2;//不断地缩小步长
}
} /**
* 选择排序
*/
void selectsort(int arr[] , int n){
for(int i = 0 ; i < n-1 ; ++i){//扫描序列n-1次
int index = i; for(int j = i+1 ; j < n ; ++j){//从i+1的位置開始扫
if(arr[j] < arr[index]){
index = j;//找到该次所扫描的序列的最小值
}
}
if(index != i){//假设最小数的位置发生变换
swap3(arr,i,index);//则进行交换
}
}
} /**
* 合并有序序列
*/
void mergeArr(int arr[],int first, int mid , int last,int temp[]){
int i = first,j = mid+1;
int m = mid,n = last;
int k = 0; while(i <= m && j <= n){//当两个序列都还有值的时候
if(arr[i] <= arr[j]){//去两个序列中的最小值
temp[k++] = arr[i++];
}else{
temp[k++] = arr[j++];
}
} //下面两个循环用于处理某一个序列没有值的情况
while(i <= m ){
temp[k++] = arr[i++];
} while(j <= n){
temp[k++] = arr[j++];
} //更新原序列
for(i = 0 ; i < k ;++i){
arr[first+i] = temp[i];
}
} /**
* 归并排序
*/
void mergeSort(int arr[],int first,int last,int temp[]){
if(first < last){//假设还没切割到仅仅剩一个元素,就不断的切割
int mid = (first+last)/2;
mergeSort(arr,first,mid,temp);//达到左边有序的状态
mergeSort(arr,mid+1,last,temp);//达到右边有序的状态
mergeArr(arr,first,mid,last,temp);//归并
}
} void quicksort(int arr[],int l,int r){
int i = l;
int j = r;
int x = arr[l];//将最左边的数作为基准数 if(l < r){
while(i < j){//假设i!=j就不断的进行循环 while(i < j && arr[j] >= x){//从后往前扫,找到第一个比基准数小的数
--j;
}
if(i < j){//假设找到了
arr[i++] = arr[j];//将坑填上,并将i的值++
} while(i < j && arr[i] <= x){//从前往后扫,找到第一个比基准数大的数
++i;
}
if(i < j){
arr[j--] = arr[i];//将坑填上,并将j的值--
}
}
arr[i] = x;//将最后的基准位置上的坑填上 //分治策略
quicksort(arr,l,i-1);//递归调用
quicksort(arr,i+1,r);
}
} void printArr(int arr[]){
int i;
for(i = 0 ; i < n ; ++i){
printf("%d " , arr[i]);
}
printf("\n");
} void handleInput(int arr[]){
int i;
for(i = 0 ; i < n ; ++i){
scanf("%d",&arr[i]);
}
}

二、下面用这些算法来做几道简单题

在上面的基础上

nefu 30

void handleInput1(int arr[],int n){
int i;
for(i = 1 ; i < n ; ++i){
scanf("%d",&arr[i]);
}
} int main(){
n = 10;
int arr[n];
while(scanf("%d",&arr[0])!=EOF){
handleInput1(arr,n);
shellsort(arr,n);//这里能够换成各种各样的算法
printArr(arr);
} return 0;
}

nefu 32

#include "sort.h"

int main(){
int t;
scanf("%d",&t); while(t--){
scanf("%d",&n);
int arr[n]; int temp[n];
handleInput(arr);
// selectsort(arr,n);
mergeSort(arr,0,n-1,temp);
printArr(arr);
}
}

NEFU 100 查找最大值

这道题的话。事实上也属于排序题。先按升序排一下序,然后输出最后一个即可了

/*
* 100.cpp
*
* Created on: 2014年5月22日
* Author: pc
*/ #include <iostream>
#include <cstdio> using namespace std; const int maxn = 1005;
int arr[maxn]; void quicksort(int arr[],int l,int r){
int i = l;
int j = r;
int x = arr[l];//将最左边的数作为基准数 if(l < r){
while(i < j){//假设i!=j就不断的进行循环 while(i < j && arr[j] >= x){//从后往前扫,找到第一个比基准数小的数
--j;
}
if(i < j){//假设找到了
arr[i++] = arr[j];//将坑填上,并将i的值++
} while(i < j && arr[i] <= x){//从前往后扫,找到第一个比基准数大的数
++i;
}
if(i < j){
arr[j--] = arr[i];//将坑填上,并将j的值--
}
}
arr[i] = x;//将最后的基准位置上的坑填上 //分治策略
quicksort(arr,l,i-1);//递归调用
quicksort(arr,i+1,r);
}
} int main(){
int n;
while(scanf("%d",&n)!=EOF){
int i;
for(i = 0 ; i < n ; ++i){
scanf("%d",&arr[i]);
} quicksort(arr,0,n-1); printf("%d\n",arr[n-1]);
} return 0;
}

(排序算法整理)NEFU 30/32的更多相关文章

  1. 排序算法整理C++(初赛)

    排序算法整理 常见考点 将一个乱掉的字符串排回有序(以交换为基本操作)的最少操作,就是冒泡排序. 排序算法的稳定性 排序算法的时间复杂度 排序算法的稳定性 稳定性是指排序前两个元素a1 = a2,a1 ...

  2. 常用的 JS 排序算法整理

    关于排序算法的问题可以在网上搜到一大堆,但是纯 JS 版比较零散,之前面试的时候特意整理了一遍,附带排序效率比较. //1.冒泡排序 var bubbleSort = function(arr) { ...

  3. 8种Java排序算法整理

    package org.hbz.test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; im ...

  4. 常见排序算法整理(python实现 持续更新)

    1 快速排序 快速排序是对冒泡排序的一种改进.  它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行 ...

  5. 洛谷 P1177 【模板】快速排序(排序算法整理)

    P1177 [模板]快速排序 题目描述 利用快速排序算法将读入的N个数从小到大排序后输出. 快速排序是信息学竞赛的必备算法之一.对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成.( ...

  6. 排序算法整理(Python实现)

    目录 1. 冒泡排序 2. 选择排序 3. 插入排序 4. 归并排序 5. 快速排序 1. 冒泡排序   冒泡排序(Bubble Sort)是稳定排序,其基本思想是:遍历待排序列,依次两两比较,如果顺 ...

  7. 排序算法整理(python version)

    import random import time def bubble_sort(a): n=len(a) while n>1: for i in range(n-1): if a[i]> ...

  8. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  9. java小程序整理及排序算法

    1. 利用循环打印如下图形 ***** **** *** ** * public class Main { public static void main(String[] args) { // TO ...

随机推荐

  1. Redis有序集合操作

    有序集合存储着成员和分值之间的映射,并且提供了分值处理命令,以及根据分值大小有序的获取或扫描成员和分值的命令 (常用命令) ZADD : ZADD key-name score member [sco ...

  2. SQL语句和EF Group by 用法

    1,Group by 根据某个字段排序 select Department,count(*) FROM [PPMG].[dbo].[UnConViolation] group by Departmen ...

  3. Java迭代器的一般用法

    迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为“轻量级”对象,因为创建它的代价小. Java中的I ...

  4. Java基础——Servlet(三)

    还在学习Servlet,觉得这里的知识点蛮多的.还要继续努力,加油. 拿韩老师的话激励一下自己,共勉.韩老师说,“成功其实也不难,只要树立一个目标,不需要你是一个很强的人,不需要你很高智商,不需要你是 ...

  5. 【Tomcat】部署Web到tomcat的四种方式

    一.静态部署 1.直接将web项目文件件拷贝到webapps 目录中     Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用.所以可以将JSP ...

  6. Java多线程高级主题

    任务定时调度 通过Timer和TimerTask,我们可以实现定时启动某个线程. java.util.Timer:类似闹钟的功能,本身实现的就是一个线程 java.util.TimerTask:一个抽 ...

  7. 使用Spring的AbstractRoutingDataSource类来进行拓展多数据源

    1.继承抽象类AbstractRoutingDataSource 通过重写这个抽象类的determineCurrentLookupKey()方法来决定返回哪个数据库. 2.配置多个数据库 <be ...

  8. HUST1017(KB3-A Dancing links)

    1017 - Exact cover Time Limit: 15s Memory Limit: 128MB Special Judge Submissions: 7270 Solved: 3754 ...

  9. Git 及 GitHub 使用

    Git bash 的常用命令 1. pwd    查看当前所在目录 2. cd cd ..         返回上一级 cd 目录    进入对应的目录 3. ls      查看当前文件夹的内容  ...

  10. vuex 管理vue-router的传值

    假设有这样的一种情况,在两个组件中.一个组件[A]主要是比如说放表格数据,而另外一个组件[B]是专门用来向组件A的表格添加数据的表单.这个时候就是两个兄弟组件之间传递数据了.首先想到的是使用兄弟组件传 ...