常用排序C实现

//冒泡

int* maopao(int a[], int n)

{

int temp = 0;

for (int i = 0; i<n-1; i++) {

for (int j = 0; j<n-1-i; j++) {

if (a[j] > a[j+1]) {

temp = a[j];

a[j] = a[j+1];

a[j+1] = a[j];

}

}

}

return a;

}

//插入排序

int* insert(int a[],int n)

{

//把一个数组分成两段,前段为插入后新队列,后段为待插入队列

for (int i = 1; i<n; i++) {

//待插入值

int temp = a[i];

//寻找插入位置

int j = i - 1;

for (; j>0; j--) {

if (a[j] > temp) {

a[j+1] = a[j];

}

}

a[j] = temp;

}

return a;

}

//折半插入排序

//也就是在寻找位置的时候,因为带插入队列已经是排序好的,可以采用二分查找,来快速定位待插入位置

int *twoInsert(int a[], int n)

{

//把一个数组分成两段,前段为插入后新队列,后段为待插入队列

for (int i = 1; i<n; i++) {

//待插入值

int temp = a[i];

//寻找插入位置

int k = i - 1;//已排序队列和未排序队列的分界线

//折半定位

int low = 0;

int high = k;

int middle = 0;

while (low < high) {

middle = (high + low)/2;

if (a[middle] > temp) {

//向前找

high = MAX(middle - 1, 0);

}else if (a[middle] <= temp) {

//向后找

low = MIN(middle + 1, k);

}

}

//确定位置

int position = low;

if (a[low] > temp) {

position = low;

}else {

position = low + 1;

}

//后移

int j = k+1;

while (j > position) {

a[j] = a[j - 1];

j--;

}

//插入

a[position] = temp;

}

return a;

}

//二分查找

int twoSearch(int a[], int n, int value)

{

int low = 0;

int hight = n-1;

int middle = 0;

while (low <= hight) {

middle = (hight + low)/2;

if (a[middle] > value) {

//向前找

hight = middle - 1;

}else if (a[middle] < value) {

//向后找

low = middle + 1;

}else {

return middle;

}

}

return -1;

}

//希尔排序,插入排序的基础上进行改造,按分量d来分组,逐渐减少d分量,直至d==1,排序结束

//因为分组的原因,希尔排序不稳定

int *shellSort(int a[], int n)

{

//分量d递减分组递增

for (int d = n/5; d>0; d--) {

//遍历所有组,分组0 - d

for (int j = 0; j < d; j++) {

//组内排序

for (int i = j; i + d < n; i += d) {

//将j+1元素插入0-j有序组中

int k = i; //待插入序列的最后一个

int temp = a[k + d]; //被插入元素

while (k >= 0) {

if (a[k] > temp) {

a[k + d] = a[k];

k = k - d;

}else {

break;

}

}

a[k+d] = temp;

}

}

}

return a;

}

//快速排序

void kuaisu(int a[], int n)

{

if (n <= 1) {

return;

}

int low = 0;

int high = n - 1;

int t = low;

int temp = a[t];

while (low < high) {

while (a[high] >= a[t] && high > low) {

high --;

}

if (a[high] < a[t]) {

a[t] = a[high];

a[high] = temp;

t = high;

}

while (a[low] <= a[t] && low < high) {

low ++;

}

if (a[low] > a[t]) {

a[t] = a[low];

a[low] = temp;

t = low;

}

if (low == high) {

kuaisu(&a[0], low);

kuaisu(&a[high+1], n - high - 1);

}

}

return ;

}

void swap(int a[],int p0,int p1)

{

int temp = a[p0];

a[p0] = a[p1];

a[p1] = temp;

}

#pragma mark -- 堆排序

void balance(int a[],int len,int root/*1-n*/)

{

if (root < 1) {

NSLog(@"balance wrong root");

return;

}

int right = 2 * root + 1;

int left = 2 * root;

root -= 1;

right -= 1;

left -= 1;

if (len > right) {

int big = right;

if (a[right] <= a[left]) {

big = left;

}

if (a[root] < a[big]) {

swap(a, root, big);

balance(a, len, big + 1);

}

}else if (len > left) {

if (a[root] < a[left]) {

swap(a, root, left);

balance(a, len, left + 1);

}

}

}

void buildHeap(int a[],int len)

{

for (int i = len/2; i > 0; i--) {

balance(a, len, i);

}

}

void heapSort(int a[], int len)

{

buildHeap(a, len);

while (len > 0) {

swap(a, len-1, 0);

len --;

balance(a, len, 1);

}

}

void main()

{

int a[100];

for (int i = 0; i<100; i++) {

a[i] = rand()%1000;

}

heapSort(a, 100);

//    kuaisu(a, 100);

//    int *b = shellSort(a, 100);

//    int *b = maopao(a,100);

//    int *b = insert(a, 100);

//    int a[] = {4,7,3,8,2,9};

//    int *b = twoInsert(a, 6);

//    int *b = shellSort(a, 6);

for (int i = 0; i<100; i++) {

NSLog(@"%d",a[i]);

}

}

时间: 2024-10-04 12:24:29

常用排序C实现的相关文章

Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]

常用排序算法比较与分析

一.常用排序算法简述 下面主要从排序算法的基本概念.原理出发,分别从算法的时间复杂度.空间复杂度.算法的稳定性和速度等方面进行分析比较.依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:[内排序].[外排序]. 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中. 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程. 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见排

七种常用排序算法

七种常用排序算法 一.常见排序算法一览: 时间复杂度: 是一个函数,它定量描述了该算法的运行时间. 空间复杂度:一个算法在运行过程中临时占用存储空间大小的量度. 稳定性:保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同就稳定,反之不稳定. 视觉直观感受 7 种常用的排序算法 二.算法C#实现: 1. 直接插入排序: using System; using System.Collections.Generic; using System.Linq; using Sys

常用排序算法之——归并排序

归并排序的原理: 如果数组的元素个数大于1,则: 将数组平均分为两部分: 左边的数组归并排序:递归 右边的数组归并排序:递归 将两个各自有序的数组合并,需要一个额外的辅助数组,暂时保存合并结果:返回 否则,数组元素个数为1时,已经有序:直接返回. 稳定排序.时间复杂度在最坏.最好.平均情况下都为O(N lgN),空间复杂度为O(N). 代码: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T>

常用排序算法之——快速排序

快速排序的原理: 首先找一个标兵值,等于某一个元素值:遍历数组,将数组分为小于标兵值和大于标兵值的两部分:然后分别对两个部分采用快速排序,递归. 分开数组时,维持一个指针,指向已找到小部分的最后一个元素:一个指针用于遍历. 不稳定排序算法.当数组已经有序时,时间复杂度最差,为O(N2),平均.最优情况下都为O(N lgN). 代码如下: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T> 5 v

javascript常用排序算法实现

毕业后,由于工作中很少需要自已去写一些排序,所以那些排序算法都忘得差不多了,不过排序是最基础的算法,还是不能落下啦,于是找了一些资料,然后用Javascript实现了一些常用的算法,具体代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>

常用排序算法实现[交换排序之冒泡排序、快速排序]

相关知识 1. 稳定排序和非稳定排序: 稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序. 如果排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前. 2. 内排序和外排序 在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序: 在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序. 3.算法分类 排序算法从理论上分为如下几类: (1) 交换排序法:

常用排序算法时间复杂度和空间复杂度简析

1. preface /**** *    This article will try to explain something about: *        --Bubble sort. *        --Quick sort. *        --Merge sort. *        --Heap sort. *    To read this, some prerequisites is necessary: *        --a survive skill in C pr

C++常用排序法、随机数

C++常用排序法研究 2008-12-25 14:38 首先介绍一个计算时间差的函数,它在<time.h>头文件中定义,于是我们只需这样定义2个变量,再相减就可以计算时间差了. 函数开头加上 clock_t start = clock(); 函数结尾加上 clock_t end = clock(); 于是时间差为: end - start 不过这不精确的 多次运行时间是不同的 和CPU 进程有关吧 (先总结一下:以下算法以时间和空间以及编码难度,以及实用性方面来看,快速排序法是最优秀的!推荐!

视觉直观感受7种常用排序算法

视觉直观感受若干常用排序算法 1 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性. 步骤: 从数列中挑出一个元素,称为 "基准"(pivo