快速排序和计数排序API

听说有十大排序算法,先学习一下快速排序和计数排序算法。

一:快速排序

 快速排序主要就是每一个找到当前取出来的标尺的数的位置,然后把小于它的数放在左边(从小到大排),把大于它的数放在右边。然后利用递归分左右继续找位置放数字,这个过程有点类似之前的根据前序和中序找后序的题目。递归的出口就是当只有一个数的时候就不需要排了。取出来的位置就是他的位置。

代码:

找每一次的位置:

int findpos(int l,int r){
	int temp = data[l];
	int i = l, j = r;
	while (i != j){
		while (data[j] >= temp&&i < j)j--;
		data[i] = data[j];
		while (data[i] <= temp&&i < j)i++;
		data[j] = data[i];
	}
	data[i] = temp;
	return i;

}

递归分区域找位置:

void quicksort(int l,int r){
	if (l >= r) return;
	int pos = findpos(l, r);

	quicksort(l,pos-1);
	quicksort(pos+1,r);

}

 需要注意的有很多:

1.递归的出口要放在quicksort的最上面,不放在上面的话如果只有一个数还去找他的位置的话可能会陷入死循环。

2.while(i!=j)中的这个对称的while语句的写法可以注意背一下。

while (data[j] >= temp&&i < j)j--;
		data[i] = data[j];
		while (data[i] <= temp&&i < j)i++;
		data[j] = data[i];

二:计数排序

  计数排序不用经过比较,在读一遍的过程中用一个数组记录当前数组出现的次数,(其实就是把排序的过程用count数组的下标来实现了)。要注意的是每一次循环变量的取值: 

第一次循环的时候是对于count清零,这时候循环变量应该等于count的下标个数,也就是要排序的数组的范围;(数组元素的下标要大于需要排序的数的范围)

第二次循环的时候是统计的时候,循环变量和要排序的数组的元素的个数相同;

第三次循环的时候是对于count数组的操作,累加得出当前元素应该放在排序好的数组中的位置。也就是有多少个数小于他,循环变量应该和count的长度相符合;

第四次循环是对于排序结果的赋值,循环变量和要排序的数组的个数相同即可。

代码:

int count[1001];
int Ans[10];
void countsort(){
	for (int i = 0; i < 1000; i++){
		count[i] = 0;
	}
	for (int i = 0; i < 10; i++){
		count[data[i]]++;
	}
	for (int i = 1; i < 1000; i++){
		count[i] = count[i] + count[i - 1];
	}
	for (int i = 0; i < 10; i++){
		Ans[--count[data[i]]] = data[i];
	}
}

完整测试代码:

#include <stdio.h>
int data[10] = { 2, 3, 1, 5, 7, 6, 4, 8, 2, 0 };
int findpos(int l,int r){
	int temp = data[l];
	int i = l, j = r;
	while (i != j){
		while (data[j] >= temp&&i < j)j--;
		data[i] = data[j];
		while (data[i] <= temp&&i < j)i++;
		data[j] = data[i];
	}
	data[i] = temp;
	return i;

}
void quicksort(int l,int r){
	if (l >= r) return;
	int pos = findpos(l, r);

	quicksort(l,pos-1);
	quicksort(pos+1,r);

}

int count[1001];
int Ans[10];
void countsort(){
	for (int i = 0; i < 1000; i++){
		count[i] = 0;
	}
	for (int i = 0; i < 10; i++){
		count[data[i]]++;
	}
	for (int i = 1; i < 1000; i++){
		count[i] = count[i] + count[i - 1];
	}
	for (int i = 0; i < 10; i++){
		Ans[--count[data[i]]] = data[i];
	}
}

int main(){
	countsort();

	return 0;
}
时间: 2024-10-17 15:02:41

快速排序和计数排序API的相关文章

算法——计数排序与快速排序

计数排序是一种算法复杂度 O(n) 的排序方法,适合于小范围集合的排序.比如100万学生参加高考,我们想对这100万学生的数学成绩(假设分数为0到100)做个排序.我们如何设计一个 最高效的排序算法.本文不光给出计数排序算法的传统写法,还将一步步深入讨论算法的优化,直到时间复杂度和空间复杂度最优. 先看看计数排序的定义 Counting sort (sometimes referred to as ultra sort or math sort[1]) is a sorting algorith

[C++]LeetCode: 127 Sort Colors (计数排序 &amp; 快速排序)

题目: Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integers 0, 1, and 2 to represent the color red, white, an

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

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

冒泡排序,快速排序,归并排序,插入排序,希尔排序,堆排序,计数排序,桶排序,基数排序

选择排序,冒泡排序,快速排序,归并排序,插入排序,希尔排序,计数排序,桶排序,基数排序 以上是一些常用的排序算法. 选择排序 for(int i = 0; i < n; i++) { int minval = a[i]; int minid = i; for (int j = i+1; j < n; j++) { if (a[j] < minval) { minid = j; minval = a[j]; } } swap(a[i], a[minid]); } 最简单的就是选择排序,就是

【数据结构】非比较排序算法(实现计数排序和基数排序)

● 计数排序 1.算法思想: 计数排序是直接定址法的变形.通过开辟一定大小的空间,统计相同数据出现的次数,然后回写到原序列中. 2.步骤: 1)找到序列中的最大和最小数据,确定开辟的空间大小. 2)开辟空间,利用开辟的空间存放各数据的个数. 3)将排好序的序列回写到原序列中. 具体实现如下: void CountSort(int *arr, int size) {  assert(arr);  int min = arr[0];  int max = arr[0];  int num = 0;

计数排序及其扩展思路

(1)原理和代码以及时间复杂度分析 1.计数排序的原理:设被排序的数组为A,排序后存储到B,C为临时数组.所谓计数,首先是通过一个数组C[i]计算大小等于i的元素个数,此过程只需要一次循环遍历就可以:在此基础上,计算小于或者等于i的元素个数,也是一重循环就完成.下一步是关键:逆序循环,从length[A]到1,将A[i]放到B中第C[A[i]]个位置上.原理是:C[A[i]]表示小于等于a[i]的元素个数,正好是A[i]排序后应该在的位置.而且从length[A]到1逆序循环,可以保证相同元素间

[经典算法]计数排序

概述: 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出.它的优势在于在对一定范围内的集合排序时,它的复杂度为Ο(n+k)(其中k是元素的范围),快于任何比较排序算法. 计数排序本质上是通过计算无序集合中元素出现的次数来决定集合应该如何排序的. 例如一个数组{1, 4, 1, 2, 7, 5, 2},进行计数排序过程 1.使用Count数组记录元素次数 Index: 0 1 2 3 4 5 6 7 8 9 Count: 0 2 2 0 1 1 0

计数排序及C语言实现

之前讨论的插入排序.归并排序.堆排序和快速排序都是基于比较的排序算法,对于所有的比较排序算法,其复杂度最优也要O(nlgn).证明过程请参考算法导论第八章第一节. 今天介绍一种非比较排序,名为计数排序. 基本思想是:对于每一个元素,确定小于该元素的个数,就可以将该元素排在正确的位置.该算法能达到线性时间复杂度,也就是O(n). 程序中,数组a为输入数组(未排序数组),b为输出数组,c为中间数组.20的意思是假设数组中每个元素均为小于20的非负整数.

桶排序,计数排序算法

计数排序: 桶排序:www.roading.org/algorithm/introductiontoalgorithm 算法模型: 1,桶排序假设待排的一组数统一分布在一个范围[m....n],将这一范围划分为几个子范围,也就是桶bucket. 例如,如何将0---999范围的数,划分到10个桶中?范围中数的个数用K表示,那么K/10=1000/10=100,就是每个桶装100个元素,即[0..99]装到第一个桶中,[100..199]装到第二个桶中,...以此类推. 怎么判断一个数组该放到哪个