排序

原创 2015年11月20日 19:42:16

//1.直接插入排序,稳定
//很久以前就学过直接插入了,但是写起来还是出了挺多问题的
void inssort(int *d, int s, int e){
	for(int i = s+1; i <= e; ++i){
		int x = d[i];
		int j = i-1;
		while(j >= s && d[j] > x){
			d[j+1] = d[j];
			--j;
		}
		d[j+1] = x;
	}
}
//2.希尔排序,不稳定
//缩小增量法,增量选择,直至增量为1
//组内直接插入排序,不喜欢插入,不过还是写一下看看
void shesort(int *d, int s, int e){
	for(int dt = (e-s)>>1; dt; dt >>= 1){
		for(int i = s+dt; i <= e; ++i){
			int x = d[i];
			int j = i - dt;
			while(j >= s && d[j] > x){
				d[j+dt] = d[j];
				j -= dt;
			}
			d[j+dt] = x;
		}
	}
}
//3.冒泡排序,稳定
void bubsort(int *d, int s, int e){
	for(int i = s; i < e; ++i){
		for(int j = e; j > i; --j){
			//此处可优化,如果扫描一遍没有发生交换,表明剩余部分也已经有序,结束排序
			if(d[j-1] > d[j]){
				int t = d[j]; d[j] = d[j-1]; d[j-1] = t;
			}
		}
	}
}
//4.快速排序,不稳定
void qsort(int *d, int s, int e){
	if(s >= e)return;
	int l = s, r = e;
	int x = d[l];
	while(l < r){
		while(l < r && x < d[r])--r;
		if(l < r)d[l++] = d[r];
		while(l < r && x > d[l])++l;
		if(l < r)d[r--] = d[l];
	}
	d[l] = x;
	qsort(d, s, l-1);
	qsort(d, l+1, e);
}
//5.简单选择排序,不稳定
void selsort(int *d, int s, int e){
	for(int i = s; i < e; ++i){
		//也可以每次都和d[i]比较,更小则交换,但是交换次数会多一些
		int id = i;
		for(int j = i+1; j <= e; ++j){
			if(d[j] < d[id])id = j;
		}
		if(id != i){
			int t = d[id]; d[id] = d[i]; d[i] = t;
		}
	}
}
//6.堆排序,不稳定
//算法是理解的,但是从来没写过,写来试试
//下标从1开始的话比较简单,2k,2k+1,从0开始也是可以的,为了一致性,此处依然从0开始,2k+1,2k+2
//大顶堆,小顶堆,此处大顶堆,输入顺序是降序,数组变为升序
//堆调整
void heapadjust(int *d, int e, int x){
	int t = d[x];
	int child;
	while((child = 2 * x + 1) <= e){
		if(child+1 <= e && d[child+1] > d[child]){
			++child;
		}
		if(t < d[child]){
			d[x] = d[child];
			x = child;
		}else{
			break;
		}
	}
	d[x] = t;
}
//首先是非叶子的调整,然后依次替换、调整,此处默认s=0,从0开始
void heasort(int *d, int s, int e){
	for(int i = (e-1)>>1; i >= 0; --i){
		heapadjust(d, e, i);
	}
	for(int i = e; i > 0; --i){
		int t = d[i]; d[i] = d[0]; d[0] = t;
		heapadjust(d, i-1, 0);
	}
}
//7.归并排序,稳定
//典型的分治,分而治之,划分→合并
void megsort(int *d, int s, int e){
	if(s >= e)return;
	int m = (s + e)>>1;
	megsort(d, s, m);
	megsort(d, m+1, e);
	int i = s, j = m +1, p = s;
	int t[len];
	while(i <= m && j <= e){
		if(d[i] <= d[j]){
			t[p++] = d[i++];
		}else{
			t[p++] = d[j++];
		}
	}
	while(i <= m){
		t[p++] = d[i++];
	}
	while(j <= e){
		t[p++] = d[j++];
	}
	for(int i = s; i <= e; ++i){
		d[i] = t[i];
	}
}
//8.基数排序(桶,分配)
//特殊情况,不予讨论
//每一位进行
//9.计数排序
//特殊情况,不予讨论
//范围小,频度高,可列

qsort和sort,比较喜欢sort,简单一些

均可自己实现cmp,实现自定义比较,比如多重排序

qsort,c语言库函数

#include <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
int cmp(const void *a, const void *b );
a-b升序,反之降序
sort,c++ stl
#include <algorithm>
using std::sort;
void sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp);
bool cmp(const Type1 &a, const Type2 &b)


a<b升序,反正降序


sort函数的用法,自定义comp参数。

sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级。本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能...
  • djd1234567
  • djd1234567
  • 2015年12月06日 19:17
  • 1868

排序学习简介

译排序学习简介,翻译自李航老师的《A Short Introduction to Learning to Rank》
  • clheang
  • clheang
  • 2016年06月15日 20:42
  • 5005

二分排序(java)

基本思想就是:将待排序元素分成大小大致相同 的两个子集合,分别 对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。package com.suanfa; /** * 二分排序 ...
  • baidu_23086307
  • baidu_23086307
  • 2016年05月30日 14:42
  • 1068

pandas学习:对series和dataframe进行排序

本问主要写根据索引或者值对series和dataframe进行排序的方法 代码: #coding=utf-8 import pandas as pd import numpy as np #以下实...
  • u014662865
  • u014662865
  • 2017年03月01日 10:53
  • 3491

jqGrid 排序功能

主要添加 sortable:true,sortorder :"asc"   某些字段不要拍戏功能的话 只要在字段中加入 sortable:false; jqgrid排序的功能是:在点击每一列的列名时,...
  • u013792648
  • u013792648
  • 2016年10月18日 10:32
  • 12886

bootstrap点击表头实现排序功能

bootstrap点击表头实现排序功能
  • Hero_QHZ
  • Hero_QHZ
  • 2017年07月27日 14:00
  • 2502

集合TreeSet(自然排序与定制排序)

一、TreeSet的自然排序: 步骤:让元素自身具备比较性, 实现Compareable接口,覆盖其CompareTo方法   class Student implements Comparable/...
  • liuchuangjin
  • liuchuangjin
  • 2015年06月15日 09:37
  • 5568

坐标点排序

//================================================================================== //功能说明:设置两个Poin...
  • huixingshao
  • huixingshao
  • 2015年01月26日 10:09
  • 3491

jqGrid表头排序功能

jqgrid表头单级和多级排序
  • zhou__yang
  • zhou__yang
  • 2017年05月04日 14:43
  • 3445

单链表之排序

题:编程实现单链表的排序。 答案:完整代码如下: // P167_example1.cpp : Defines the entry point for the console applicatio...
  • jimoshuicao
  • jimoshuicao
  • 2013年07月30日 16:40
  • 2979
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序
举报原因:
原因补充:

(最多只允许输入30个字)