快速排序 之添加复合插入排序和原始序列取中值左pivot
2017-12-15 11:58
232 查看
quicksort中,当n小于一定值时,排序效率就比直接插入排序底了,所以,此时就不要再递归下去了,直接插入排序好了;快速的原理就是因为折半递归,所以初始pivot应该有个好一点的选择,这里在原序列左右和中间序的值取中值作为pivot,位置仍然放置于左侧第一元素位置(交换)。
这就变成了工程优化的快速排序了
——————————————————————————————————————————————————
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void insertsort(int arr[], int left, int right)
{
int temp, i, j;
for (i=left+1; i<=right; i++)
{
if (arr[i]<arr[i-1])
{
temp = arr[i];
for(j=i-1; j>=left&&temp<arr[j]; j--)
{
arr[j+1] = arr[j];
}
arr[j+1] = temp;
}
}
}
int partition(int arr[], int low, int high)
{
int i = low, j = high, pivot = arr[low];
while (i<j)
{
while (i<j&&arr[j]>=pivot)
{
j--;
}
if (i<j)
{
arr[i] = arr[j];
i++;
while (i<j&&arr[i]<=pivot)
{
i++;
}
if (i<j)
{
arr[j] = arr[i];
j--;
}
}
}
arr[i] = pivot;
return i;
}
void swap(int arr[], int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void median3_alignleft(int arr[], int left, int right)
{
int mid = (left+right)/2, k1, k2;
if (arr[left]<=arr[mid])
{
k1 = left;
k2 = mid;
}
else
{
k1 = mid;
k2 = left;
}
if (arr[right]<arr[k1])
{
k2 = k1;
}
else if (arr[right]<arr[k2])
{
k2 = right;
}
if (k2!=left)
{
swap(arr, k2, left);
}
}
void quicksort_insert(int arr[], int left, int right, int M)
{
if (right-left<=0)
{
return;
}
if (right-left+1<M)
{
insertsort(arr, left, right);
}
else
{
median3_alignleft(arr, left, right);
int pivotpos = partition(arr, left, right);
quicksort_insert(arr, left, pivotpos-1, M);
quicksort_insert(arr, pivotpos+1, right, M);
}
}
void main()
{
int arr[] = {99, 29, 17, 11, 36, 55, 47, 2, 3, 8, 12, 66};
int len = sizeof(arr)/sizeof(int);
quicksort_insert(arr, 0, len-1, 5);
for(int i=0; i<len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
//result
# ./sort
2 3 8 11 12 17 29 36 47 55 66 99
Finally:
M可以固定取值5-25之间任意数
这个可以作为自实现算法库来保留了,你的C工程里最好能有它。
这就变成了工程优化的快速排序了
——————————————————————————————————————————————————
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void insertsort(int arr[], int left, int right)
{
int temp, i, j;
for (i=left+1; i<=right; i++)
{
if (arr[i]<arr[i-1])
{
temp = arr[i];
for(j=i-1; j>=left&&temp<arr[j]; j--)
{
arr[j+1] = arr[j];
}
arr[j+1] = temp;
}
}
}
int partition(int arr[], int low, int high)
{
int i = low, j = high, pivot = arr[low];
while (i<j)
{
while (i<j&&arr[j]>=pivot)
{
j--;
}
if (i<j)
{
arr[i] = arr[j];
i++;
while (i<j&&arr[i]<=pivot)
{
i++;
}
if (i<j)
{
arr[j] = arr[i];
j--;
}
}
}
arr[i] = pivot;
return i;
}
void swap(int arr[], int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void median3_alignleft(int arr[], int left, int right)
{
int mid = (left+right)/2, k1, k2;
if (arr[left]<=arr[mid])
{
k1 = left;
k2 = mid;
}
else
{
k1 = mid;
k2 = left;
}
if (arr[right]<arr[k1])
{
k2 = k1;
}
else if (arr[right]<arr[k2])
{
k2 = right;
}
if (k2!=left)
{
swap(arr, k2, left);
}
}
void quicksort_insert(int arr[], int left, int right, int M)
{
if (right-left<=0)
{
return;
}
if (right-left+1<M)
{
insertsort(arr, left, right);
}
else
{
median3_alignleft(arr, left, right);
int pivotpos = partition(arr, left, right);
quicksort_insert(arr, left, pivotpos-1, M);
quicksort_insert(arr, pivotpos+1, right, M);
}
}
void main()
{
int arr[] = {99, 29, 17, 11, 36, 55, 47, 2, 3, 8, 12, 66};
int len = sizeof(arr)/sizeof(int);
quicksort_insert(arr, 0, len-1, 5);
for(int i=0; i<len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
//result
# ./sort
2 3 8 11 12 17 29 36 47 55 66 99
Finally:
M可以固定取值5-25之间任意数
这个可以作为自实现算法库来保留了,你的C工程里最好能有它。
相关文章推荐
- 快速排序-常见中轴(主元pivot)选择方法及实现代码(末位/随机/三数中值/..)
- 快速排序(三数中值、三向切分、转插入排序)
- 排序-快速排序-优化-使用插入排序
- PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
- 直通BAT-排序1(冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序)
- 冒泡排序,熙儿排序,快速排序,插入排序,堆排序,基数排序性能对比
- 快速排序的枢轴(pivot)和边界
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析
- 图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序
- Python版插入排序,归并排序,快速排序
- Java程序员从笨鸟到菜鸟(二)Java实现冒泡排序、快速排序、插入排序、选择排序等基本排序方式
- 几种简单的排序:选择排序,插入排序,快速排序,冒泡排序
- 插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序
- 高级排序-快速排序-使用插入排序来处理小于10个数据项的子数组,使快速排序性能发挥到极致。
- C语言:数组排序(插入排序、选择排序、泡排序、谢尔排序、快速排序、堆排序)
- 常见排序之快速排序、冒泡排序、插入排序、选择排序
- 归并排序,插入排序,快速排序,冒泡排序,选择排序的思想
- 读书笔记 算法导论 快速排序 QuickSort 使用最后一个元素作为pivot
- 各种常见的排序,冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序
- 快速排序、插入排序、归并排序