一、冒泡排序
public void bubbleSort(int[] a) {
int temp;
for (int i = a.length - 1; i > 1; i--) {
for (int j = 0; j < i; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
冒泡排序的算法是要将最小的数据项放在数组的最开始,并将最大的数据项放在数组的最后。每次比较为真,便将较小的数据项向前移动,同时将较大的数据项向后移动,外层for循环每执行一次,便有一个最大的数据项移至数组最末端,并且不再处理。
冒泡排序是最简单的一种排序方法,也是最慢的一种排序方法。它的算法复杂度是O(n^2),比较次数:N*(N-1)/2,交换次数最坏的情况也是:N*(N-1)/2。
二、选择排序
public static void selectionSort(int[] a) {
int min, temp;
for (int i = 0; i < a.length - 1; i++) {
min = i;
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[min])
min = j;
}
if (i != min) {
temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
}
选择排序的算法是在每一次的循环中,在 a.length – i +1 个 记录中选取最小的数据项作为数组的第i个记录。
虽然选择排序和冒泡排序执行了相同的比较次数:N*(N-1)/2,但是选择排序将必要的交换次数从O(n^2)减少到了O(n)。对于100个数据项,需要4950次比较,但选择排序只进行了不到100次交换。当N值很 大时,比较的次数是主要的,但是,选择排序无疑更快,因为它进行的交换次数少的多。所以,当N比较小,特别是如果交换的性能消耗比比较的性能消耗大得多时,用选择排序是相当快的。
三、插入排序
public void inserionSort(int a[]){
int temp;
for (int out=1;out < a.length;out++){
temp = a[out];
int in = out;
while (in >0 && a[in-1] >= temp){
a[in] = a[in-1];
in--;
}
a[in] = temp;
}
}
插入排序的算法是将一个数据项插入到已排好序的有序数组(部分有序)中,从而得到一个新的、数据项个数增1的有序数组。
插入排序的比较次数实际上大约是N*(N-1)/4 次。复制的次数大致等于比较的次数,由于一次复制与一次交换的时间耗费不同,所以相对于随机数据,这个算法比冒泡排序快一倍,比选择排序略快。
如果数据基本有序,插入排序几乎只需要O(N)的时间;然后对于逆序排列的数据,每次比较和移动都会执行,所以这时插入排序并不比冒泡快。
四、快速排序
public static void recQuickSort(int a[], int left, int right) {
if (right - left <= 0)
return;
else {
int partition = partitionIt(a, left, right);
recQuickSort(a, left, partition - 1); // sort left side
recQuickSort(a, partition + 1, right); // sort right side
}
}
public static int partitionIt(int a[], int left, int right) {
int leftPtr = left - 1;
int rightPtr = right;
int pivot = a[right];
while (true) {
while (a[++leftPtr] < pivot);
while (rightPtr > 0 && a[--rightPtr] > pivot);
if (leftPtr >= rightPtr)
break;
else {
swap(a, leftPtr, rightPtr);
}
}
swap(a, leftPtr, right);
return leftPtr;
}
public static void swap(int a[], int dex1, int dex2)
{
int temp = a[dex1];
a[dex1] = a[dex2];
a[dex2] = temp;
}
快速排序的算法是取得数组中的某一个值,并按此值将数组分割为两个字数组,递归对字数组按此方法排序。
快速排序算法的性能主要取决于每次对中间值得获取,换言之即为对数组划分的对称性。
快速排序算法在平均情况下的时间复杂度是O(nlogn)。在大多数情况下,该算法的排序是最快的,快速排序也因此而得名。
分享到:
相关推荐
最快的排序算法 C语言最简单的排序算法冒泡排序并返回排序前索引序号,排序算法数据结构
最快的排序算法 最快的内部排序法—桶排序法,排序算法数据结构
最快的排序算法 最快的内部排序法—桶排序法 (1),排序算法数据结构
合并排序算法和快速排序算法采用了采用分治法、递归的方法,将时间复杂度降为O(nlogn)。在本次实验中将数据量提到5万的时候,该类算法运行时间仍在几毫秒左右,而上面的3种算法运行时间已经到达十几秒左右,效率...
该程序包含7大排序算法: # sort.bubbleSort() #冒泡排序 # sort.shellSort() #希尔排序 # sort.insertionSort() #插入排序 # sort.Selectionsort1() #选择排序 # sort.heapSort() #堆排序 # sort.countSort() ...
之前说过轴的选择是快速排序法的效率关键之一,在这边的快速排序法的轴选择方式更加快了快速排序法的效率,它是来自演算法名书 Introduction to Algorithms 之中。
常用排序算法的动态演示系统的开发,演示冒泡排序法、快速排序法、直接插入排序法、折半插入排序法、树形选择排序法
常见经典排序算法(C语言)1希尔排序 二分插入法 直接插入法 带哨兵的直接排序法 冒泡排序 选择排序 快速排序 堆排序.docx
总结了各种排序算法,并用C++代码实现,并有演示
桶式排序法桶式排序法桶式排序法桶式排序法
js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js...
题目一: 内排序算法比较 1) 对以下6种常用的内部排序算法进行比较:起泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序。 2) 待排序记录的文件个数不小于1000( 其数据用伪随机数产生),至少用5组...
十大经典排序算法 排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中 进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序 记录,在...
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
1、本演示程序对以下6种常用的内部排序算法进行实测比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。 2、待排序表的表的元素的关键字为整数,表长不小于100;其中的数据要用伪随机数产生...
常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结
在STM8S003单片机上实现数组排序,用3种冒泡排序法对数组进行排序,并通过串口打印排序过程。
1、常见排序算法实现(1-6选择几个算法练习) 1)问题描述:输入一组关键字序列分别实现下列排序。 (1)实现简单选择排序、直接插入排序和冒泡排序。 (2)实现希尔排序算法。 (3)实现折半插入排序。 ...
使用简单数组实现下面各种排序算法的功能,并进行比较, 排序算法如下: a) 插入排序; b) 希尔排序; c) 冒泡排序; d) 快速排序; e) 简单选择排序; f) 堆排序; g) 归并排序; h) 基数排序(选作); i) 其他; ...
在之前所介绍过的排序方法,都是属于「比较性」的排序法,也就是每次排序时 ,都是比较整个键值的大小以进行排序。 这边所要介绍的「基数排序法」(radix sort)则是属于「分配式排序」(distribution sort),基数...