public class CombineQuickSortInsertionSort {
private long[] data;
private int len;
public CombineQuickSortInsertionSort(int max) {
data = new long[max];
len = 0;
}
public void insert(long value) {
data[len] = value;
len++;
}
public void display() {
System.out.print("Data:");
for (int j = 0; j < len; j++)
System.out.print(data[j] + " ");
System.out.println("");
}
public void quickSort() {
recQuickSort(0, len - 1);
}
public void recQuickSort(int left, int right) {
int size = right - left + 1;
if (size < 10) // insertion sort if small
insertionSort(left, right);
else // quicksort if large
{
long median = medianOf3(left, right);
int partition = partitionIt(left, right, median);
recQuickSort(left, partition - 1);
recQuickSort(partition + 1, right);
}
}
public long medianOf3(int left, int right) {
int center = (left + right) / 2;
// order left & center
if (data[left] > data[center])
swap(left, center);
// order left & right
if (data[left] > data[right])
swap(left, right);
// order center & right
if (data[center] > data[right])
swap(center, right);
swap(center, right - 1);
return data[right - 1];
}
public void swap(int d1, int d2) {
long temp = data[d1];
data[d1] = data[d2];
data[d2] = temp;
}
public int partitionIt(int left, int right, long pivot) {
int leftPtr = left; // right of first elem
int rightPtr = right - 1; // left of pivot
while (true) {
//find bigger
while (data[++leftPtr] < pivot)
;
//find smaller
while (data[--rightPtr] > pivot)
;
if (leftPtr >= rightPtr) // if pointers cross, partition done
break;
else
swap(leftPtr, rightPtr);
}
swap(leftPtr, right - 1); // restore pivot
return leftPtr; // return pivot location
}
public void insertionSort(int left, int right) {
int in, out;
// sorted on left of out
for (out = left + 1; out <= right; out++) {
long temp = data[out]; // remove marked item
in = out; // start shifts at out
// until one is smaller,
while (in > left && data[in - 1] >= temp) {
data[in] = data[in - 1]; // shift item to right
--in; // go left one position
}
data[in] = temp; // insert marked item
}
}
public static void main(String[] args) {
int maxSize = 16;
CombineQuickSortInsertionSort arr = new CombineQuickSortInsertionSort(maxSize);
for (int j = 0; j < maxSize; j++)
{
long n = (int) (java.lang.Math.random() * 99);
arr.insert(n);
}
arr.display();
arr.quickSort();
arr.display();
}
}
http://hi.baidu.com/%D0%C7%C7%E9%C0%E1/blog/item/8b5f54b3d683eaa1d9335ad8.html
先留着,晚上在看 附带的是我改写的排序算法
分享到:
相关推荐
### 冒泡、快排、插入、合并、选择排序算法集锦 #### 一、冒泡排序 **原理概述:** 冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的...
总的来说,快速排序通常比插入排序更快,特别是对于大数据集,因为快速排序的平均时间复杂度为O(n log n),而插入排序在最坏情况下的时间复杂度为O(n^2)。然而,插入排序在处理小规模或部分有序的数据时效率较高,...
实验进行的是对快排使用插入排序进行优化,并对快排产生的不同的区间内元素个数值进行测试并计算运行时间,进行比较。代码已经进过测试可以使用
压缩包内的"数据结构——快排和直接插入算法的性能比较"很可能是包含代码实现和性能测试的资料,可以提供直观的比较结果,帮助我们更好地掌握这两种排序算法的实际表现。通过实际运行和分析这些代码,我们可以深入...
快速排序和插入排序是两种广泛使用的排序算法,它们在计算机科学和编程中具有重要的地位。本文将详细讨论这两种排序算法的原理、实现以及如何结合它们的优点以提高排序效率。 快速排序是一种高效的比较型排序算法,...
例如,直接插入排序和冒泡排序适合小规模数据,而快速排序和堆排序则适用于大规模数据。选择排序和希尔排序在某些特定条件下也能展现出较高的效率。在实际应用中,我们需要根据数据的特性、内存限制以及时间效率要求...
排序算法_插入排序,快排,归并排序【数据结构和算法入门3】
插入排序是一种简单的排序算法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。在Java中实现插入排序,主要涉及数组操作和循环控制,我们可以从以下几个方面来理解这...
本文将深入探讨三种常见的排序算法:堆排序、插入排序和优先队列排序(也称为堆排序的一种变体),并主要关注它们在大规模数据集上的运行时间性能。 首先,我们来看插入排序。插入排序是一种简单直观的排序算法,它...
快速排序用的主要是partition函数,在此程序里,快速排序改进,在调用partition将数组进行分组的时候,当子数组个数小于k时,不继续做快速排序...将返回的基本有序的数组进行插入排序,这样大大提高了快速排序的效率!
插入排序,希尔排序,快速排序的源代码,运用递归进行,并在vs2010环境下测试通过
数据结构---直接插入排序/快速排序/选择排序/冒泡排序(详细实现算法和性能比较)
基本排序算法实现(冒泡,插入排序,快排,希尔排序,堆排序,计数排序,等等)_SortCode
例如,对于大数据集,可能需要考虑空间复杂度较低的算法,如快速排序和归并排序;对于小规模数据或部分有序数据,插入排序可能更为高效。理解这些排序算法的原理和特性,对于优化代码性能和解决实际问题至关重要。
2. **插入排序**:插入排序的工作原理是将数组分为已排序和未排序两部分,然后逐个将未排序的元素插入到已排序部分的正确位置。在Java中,可以使用一个外层循环来遍历未排序部分,再用一个内层循环找到插入位置,并...
例如,当处理小规模数据或部分有序的数据时,插入排序和冒泡排序可能更合适;而处理大规模数据时,快速排序和堆排序则表现出更好的性能。了解并熟练掌握这些排序算法,对于提升编程技能和解决实际问题具有重要意义。...
根据提供的文件信息,我们可以深入分析并提取出有关冒泡排序、插入排序、快速排序和选择排序的C语言实现的关键知识点。 ### 冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素...
本文介绍的插入合并排序法是一种结合了插入排序和合并排序优点的新型内排序算法,它既保持了插入排序在小规模数据集上的高效性,又具备合并排序对于大数据量处理时的良好性能。 #### 引言 排序在计算机应用中占据...
例如,当处理小规模数据或部分有序的数据时,插入排序可能更快,因为其不需要额外的存储空间且对部分有序的数据有较好的性能。因此,一种优化策略是在归并排序中使用插入排序,当子序列的大小小于一定阈值时,切换到...