8种经典排序算法总结

1.二分查找

代码:

int binarySearch(int arr[],int l,int r,int x)

{

while(l <= r)

{

int m = l + (r-1)/2;//为了防止(l+r溢出)

if(arr[m] == x)

return m;

if(arr[m] < x)

l = m + 1;

else

r = m - 1;

}

return -1;

}

问题扩展1:给定一个有序的数组,用最少的比较次数找出给定的元素。

代码:

int binarySearch(int arr[],int l,int r,int x)//r应该初始化为arr.length

{

int m;

while(r - l > l)

{

m = l + (r-l)/2;

if(arr[m] <= x)

l = m;

else

r = m;

}

if(arr[l] == x)

return l;

else

return -1;

}

问题扩展2:Given an array of N distinct integers, find floor value of input ‘key’. Say, A = {-1, 2, 3, 5, 6, 8, 9, 10} and key = 7, we should return 6 as outcome.

代码:

int binarySearch(int arr[],int l,int r,int x)

{

int m;

while(r - l > l)

{

m = l + (r-l)/2;

if(arr[m] <= x)

l = m;

else

r = m;

}

return arr[l];

}

int floor(int arr[],int size,int x)

{

if(x < arr[0])

return -1;

return binarySearch(arr,0,size,x);//注意,r初始化为size

}

问题扩展3:Given a sorted array with possible duplicate elements. Find number of occurrences of input ‘key’ in log N time.

代码:

int getRightPosition(int A[],int l,int r,int key)

{

int m;

while(r - l > 1)

{

m = l + (r - l)/2;

if(A[m] <= key)

l = m;

else

r = m;

}

return 1;

}

int getLeftPosition(int A[],int l,int r,int key)

{

int m;

while(r - l > 1)

{

m = l + (r - l)/2;

if(A[m] >= key)

r = m;

else

l = m;

}

return r;

}

int CountOccurances(int A[],int size,int key)

{

int left = getLeftPosition(A,-1,size-1,key);

int rigth = getRightPosition(A,0,size,key);

if(A[left] == key && key == A[right])

return right-right+1;

else

return 0;

}

2.选择排序

代码实现:

void selectionSort(int arr[],int n)

{

int i,j,min_index;

for(i = 0;i < n;i++)

{

min_index = i;

for(j = i;j < n;j++)

if(arr[j] < arr[min_index])

min_index = j;

swap(&arr[i],&arr[min_index]);

}

}

时间复杂度:O(n*n)

空间复杂度:O(1)

3.冒泡排序

代码:

void bubbleSort(int arr[],int n)

{

int i,j;

for(i = 0;i < n;i++)

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

{

if(arr[j] > arr[j+1])

swap(&arr[j],&arr[j+1]);

}

}

时间复杂度:O(n*n)

空间复杂度:O(1)

4.插入排序

代码:

void insertionSort(int arr[],int n)

{

int i,key,j;

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

{

key = arr[i];

j = i - 1;

while(j >= 0 && arr[j] > key)

{

arr[j+1] = arr[j];

j--;

}

arr[j+1] = key;

}

}

时间复杂度:O(n*n)

空间复杂度:O(1)

5.归并排序

代码:

void merge(int array[],int l,int m,int r)//将两个有序的数组合并

{

int n1 = m - l + 1;

int n2 = r - m;

int temp1[n1];

int temp2[n2];

int i,j,k;

for(i = 0;i < n1;i++)

temp1[i] = array[i+l];

for(j = 0;j < n2;j++)

temp2[j] = array[m+1+j];

i = 0;

j = 0;

k = l;

while(i < n1 && j < n2)

{

if(temp1[i] < temp2[j])

{

array[k] = temp1[i];

i++;

k++;

}

else

{

array[k] = temp2[j];

j++;

k++;

}

}

while(i < n1)

{

array[k] = temp1[i];

i++;

k++;

}

while(j < n2)

{

array[k] = temp2[j];

j++;

k++;

}

}

void mergeSort(int array[],int l,int r)

{

if(r - l > 0)

{

int m = l+(r-l)/2;

mergeSort(array,l,m);

mergeSort(array,m+1,r);

merge(array,l,m,r);

}

}

时间复杂度:O(nlg(n))

空间复杂度:O(n)

6.堆排序

思路:

Heap Sort Algorithm for sorting in increasing order:

1. Build a max heap from the input data.

2. At this point, the largest item is stored at the root of the heap. Replace it with the last item of the heap followed by reducing the size of heap
by 1. Finally, heapify the root of tree.

3. Repeat above steps until size of heap is greater than 1

代码:

void maxHeapify(struct MaxHeap * maxHeap,int index)

{

int left = index * 2 + 1;//左子节点的下标

int right = index * 2 + 2;//右子节点的下标

int maxIndex = index;

if(left < maxHeap->size && maxHeap->array[left] > maxHeap->array[index])

maxIndex = left;

if(right < maxHeap->size && maxHeap->array[right] > maxHeap->array[maxIndex])

maxIndex = right;

if(maxIndex != index)

{

swap(&maxHeap->array[maxIndex],&maxHeap->array[index]);

maxHeapify(maxHeap,maxIndex);

}

}

struct MaxHeap * createAndBuildHeap(int * arr,int n)

{

int i;

struct MaxHeap * maxHeap = (struct MaxHeap*)malloc(sizeof(struct MaxHeap));

maxHeap->size = n;

maxHeap->array = arr;

for(i = (maxHeap->size/2)-1;i >= 0;i--)//从下标最大的父节点开始heapify操作

maxHeapify(maxHeap,i);

return maxHeap;

}

void headpSort(int arr[],int n)

{

struct MaxHeap * maxHeap = createAndBuildHeap(arr,n);

while(maxHeap->size > 1)

{

swap(&maxHeap->array[0],&maxHeap->array[maxHeap->size-1]);

maxHeap->size--;

maxHeapify(maxHeap,0);

}

}

7.快速排序

思路:每次根据比数组中最后一个元素大还是小将数组分为两个部分,然后递归地对这两个部分运用快排。

代码:

int partition(int array[],int l,int h)

{

int i = l - 1;

int target = array[h];

int j;

for(j = l;j <= h-1;j++)

{

if(array[j] <= target)

{

i++;

swap(&array[i],&array[j]);

}

}

swap(&array[i+1],&array[h]);

return i+1;

}

void quickSort(int arr[],int l,int h)

{

if(h > l)

{

int pos = partition(arr,l,h);

quickSort(arr,l,pos-1);

quickSort(arr,pos+1,h);

}

}

时间复杂度:O(nlg(n))

8.希尔排序

代码:

void shellSort(int arr[],int n)

{

int gap,i,j,temp;

for(gap = n/2;gap > 0;gap = gap/2)

{

for(i = gap;i < n;i++)

{

temp = arr[i];

for(j = i;j >= gap && arr[j - gap] > temp;j = j - gap)

arr[j] = arr[j - gap];//插入排序

arr[j] = temp;

}

}

}

时间: 2024-07-30 14:06:24

8种经典排序算法总结的相关文章

七种经典排序算法最全攻略

经典排序算法在面试中占有很大的比重,也是基础.包括冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序.希望能帮助到有需要的同学.全部程序采用JAVA实现. 本篇博客所有排序实现均默认从小到大. 一.冒泡排序 BubbleSort 介绍: 冒泡排序的原理非常简单,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来. 步骤: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对第0个到第n-1个数据做同样的工作.这时,最大的数就"浮"到了

Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现

2017年4月29日~5月1日,国际劳动节, 三天的小长假. 在国内,小长假往往是这样的: 然而我当时在戏称为"德村"(德国农村)的Walldorf出差并且住在Wiesloch, 这里的五一小长假能听见鸟叫,虫鸣,和风吹过的声音,除此之外再无其他. 街道上别说行人了,连行驶的汽车都很少. 如果一个在成都习惯了热闹生活的人,到了这种乡下地方来估计会觉得百无聊赖.当时国内有同事建议我小长假去德国其他地方转转,然而作为一个30年资深宅男,一个人出去转不是我的风格. 五一放假之前,坐我对面的一

九种经典排序算法汇总

/*********************************************************** 总结各种排序算法包括但不限于: 1. 插入排序类 1.1 直接插入排序 1.2 二分插入排序 1.3 希尔排序 2. 交换排序类 2.1 冒泡排序 2.2 快速排序 3. 选择排序 3.1 直接选择排序 3.2 堆排序 4. 归并排序 5. 基数排序 以上所有排序算法的实现均为将整形数组data递增排序 ************************************

九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)

综述 最近复习了各种排序算法,记录了一下学习总结和心得,希望对大家能有所帮助.本文介绍了冒泡排序.插入排序.选择排序.快速排序.归并排序.堆排序.计数排序.桶排序.基数排序9种经典的排序算法.针对每种排序算法分析了算法的主要思路,每个算法都附上了伪代码和C++实现. 算法分类 原地排序(in-place):没有使用辅助数据结构来存储中间结果的排序**算法. 非原地排序(not-in-place / out-of-place):使用了辅助数据结构来存储中间结果的排序算法 稳定排序:数列值(key)

java的几种经典排序算法

排序算法大致有直接插入排序.折半插入排序.Shell排序.归并排序.直接选择排序.堆排序.冒泡排序.快速排序.桶式排序.基数排序等这些种,各个算法都有其优异性,大家不妨自己看看.下面贴上每个算法的简单讲解和实现: 1.直接选择排序(DirectSelectSort):其关键就是对n个数据要进行n-1趟比较,每趟比较的目的就是选择出本趟比较中最小的数据,并将选择出的数据放在本趟中的第一位.实现如下: [java] view plaincopy <span style="font-size:1

几种经典排序算法的R语言描述

1.数据准备 # 测试数组 vector = c(5,34,65,36,67,3,6,43,69,59,25,785,10,11,14) vector ## [1] 5 34 65 36 67 3 6 43 69 59 25 785 10 11 14 2.R语言内置排序函数 在R中和排序相关的函数主要有三个:sort(),rank(),order(). sort(x)是对向量x进行排序,返回值排序后的数值向量; rank()是求秩的函数,它的返回值是这个向量中对应元素的“排名”; order()

经典排序算法的零基础通俗讲解

一.几种经典排序算法的排序过程及时间复杂度 冒泡:时间复杂度O(n²) 第一个数和第二个数比较,大的放在后边,然后第二个数再和第三个数比较,大的放在后面.以此类推. 选择:时间复杂度O(n²): 0到n-1里找最小值放位置0上:1到n-1里找最小值放位置1上 以此类推 插入:时间复杂度O(n²) 一个数 和他前边的数比较 如果大于那个数就放在那个数后面 如果比那个数小就一直往前比较 直到比某个数大就放在那个数后面.如果都没有就放在首位置. 时间复杂度:O(N*logN) : 归并排序,快速排序,

经典排序算法总结与实现 ---python

原文:http://wuchong.me/blog/2014/02/09/algorithm-sort-summary/ 经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,在寒假里整理并用Python实现了七大经典排序算法,包括冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序.希望能帮助到有需要的同学.之所以用Python实现,主要是因为它更接近伪代码,能用更少的代码实现算法,更利于理解. 本篇博客所有排序实现均默认从小到大. 一.冒泡排序 BubbleSort 介绍

经典排序算法及python实现

今天我们来谈谈几种经典排序算法,然后用python来实现,最后通过数据来比较几个算法时间 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面).(注:选自百度百科) 假如,有一个无须序列A={6,3,1,9,2,5,8,7,4},