改进的快速排序算法

来源:互联网 发布:拼立得mac版 编辑:程序博客网 时间:2024/05/22 02:28

快速排序算法的改进思路

1.选取好的基准,是两边的数据个数尽量的均匀

   取数组的第一个,中间,最后一个数据,取三个数中第二大的数作为基准

2. 不递归

3.与插入结合,当段内的数组个数小于等于16的时候,使用插入排序

具体实现代码如下:

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <time.h>/***********************************************改进的快速排序*1.取第一个和最后一个和中间元素进行排序,*  取排序好了的中间元素当基准元素*2.不递归*3.与插入结合***********************************************///给三个数进行排序并返回中间数据int getmid(int start, int mid, int end){int t;if(start > mid){t = start;start = mid;mid = t;}if(mid > end){t = mid;mid = end;end = t;}if(start > mid){t = mid;mid = start;start = t;}return mid;}/*****************主函数**********************/void main(){int n;   //输入数组的长度printf("请输入数组的长度:\n");scanf("%d",&n);int *a = (int *)malloc(n*sizeof(int));//int a[10] = {0,94,25,29,3,45,1,35,28,99};int *b = (int *)malloc(n*sizeof(int));  //使用队列将程序改为非递归int head = 0;                  //队头int rear = 0;                  //队尾    srand(time(0));//初始化数组for(int i=0; i<n; i++){a[i] = rand()%100;}//输出排序前的数组printf("\n");printf("输出排序前的数组:\n");for(i=0; i<n; i++){printf("%d\t",a[i]);}//排序b[rear++]=0; //现将头放到队列中,再将尾放到队列中b[rear++]=n-1;while(head != rear){int start = b[head++];int end = b[head++];int mid = (start+end)/2;if(end-start <=16){//使用插入排序for(i=1; i<=end; i++){int temp=a[i];for(int j=i-1; j>=0; j--){if(a[j]>temp){a[j+1]=a[j];}else{break;}}a[j+1] = temp;}}else{//使用快速排序int front=start;int tail = end;int temp = getmid(a[front],a[mid],a[tail]);int t = temp;temp = a[start];a[start] = t;while(tail > front){while(a[tail]>temp && tail>front)tail--;if(tail>front){a[front++] = a[tail];}while(a[front]<temp && front<tail)front++;if(tail>front){a[tail--]=a[front];}}a[front] = temp;if(front-1 > start){b[rear++] = start;b[rear++] = front-1;}if(end > front+1){b[rear++] = front+1;b[rear++] = end;}}}//输出排序后的数组printf("\n");printf("输出排序后的数组:\n");for(i=0; i<n; i++){printf("%d\t",a[i]);}free(a);}