【C/C++】快速排序的两种实现思路

方法一:不断填坑,一次确定一个值。http://blog.csdn.net/morewindows/article/details/6684558

#include<stdio.h>

void qsort(int *array, int len)
{
    int value, start, end;
    if (len <= 1)
        return;
    value = array[0];
    start = 0;
    end = len - 1;
    while (start < end) {
        for (; start < end; --end) {
            if (array[end] < value) {
                array[start++]=array[end];
                break;
            }
        }
        for (; start < end; ++start) {
            if (array[start] > value)
            {
                array[end--]=array[start];
                break;
            }
        }
    }
     array[start]=value;
    qsort(array, start );
    qsort(array+start+1 , len-start-1 );
}

int main()
{
int a[10]={9,8,7,3,4,5,6,1,2,0};
qsort(a,10);
int i;
for(i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
}

方法二:一次找到两个值交换 http://developer.51cto.com/art/201403/430986.htm

#include <stdio.h>
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left,int right)
{
    int i,j,t,temp;
    if(left>right)
       return; 

    temp=a[left]; //temp中存的就是基准数
    i=left;
    j=right;
    while(i!=j)
    {
                   //顺序很重要,要先从右边开始找
                   while(a[j]>=temp && i<j)
                            j--;
                   //再找右边的
                   while(a[i]<=temp && i<j)
                            i++;
                   //交换两个数在数组中的位置
                   if(i<j)
                   {
                            t=a[i];
                            a[i]=a[j];
                            a[j]=t;
                   }
    }
    //最终将基准数归位
    a[left]=a[i];
    a[i]=temp; 

    quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程
    quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程
}
int main()
{
    int i,j,t;
    //读入数据
    scanf("%d",&n);
    for(i=1;i<=n;i++)
                   scanf("%d",&a[i]);
    quicksort(1,n); //快速排序调用 

    //输出排序后的结果
    for(i=1;i<=n;i++)
        printf("%d ",a[i]);
    getchar();getchar();
    return 0;
} 
时间: 2024-10-12 22:40:37

【C/C++】快速排序的两种实现思路的相关文章

算法整理(二)---快速排序的两种实现方式:双边扫描和单边扫描

首先简单谈下快速排序的特点,时间复杂度O(nLog n),最差时间复杂度O(n^2),平均时间O(nLog n).因为用到了函数栈,空间复杂度为O(lg n),最差为O(n).是一种不稳定的排序方法.基本思想是分治法,这位大大的http://blog.csdn.net/morewindows/article/details/6684558 讲的非常清楚了,分治法+挖坑法,我就不多说了.就是以某个数为参照,使得左边的都小于他,右边的数都大于他.然后对他的左右两个区间采取同样的方法进行递归. 就其整

python实现快速排序算法(两种不同实现方式)

# -*- coding: utf-8 -*- """ Created on Fri May 16 17:24:05 2014 @author: lifeix """ #快速排序 import sys import random length = 30 def qsort(arr,left,right): lp = left rp = right if lp == rp:return while True: while arr[lp] >=

用两种递归思路与循环实现单链表的反转

typedef struct ListNode{ int data; struct ListNode *next; }ListNode; //递归一 ListNode *ReverseList (ListNode *pHead, ListNode *nHead = NULL) { //每次取下第一个节点头插法创建新链表 //nHead为反转后链表的头节点 if(pHead == NULL) return NULL; ListNode *pNext = pHead -> next; pHead -

Top K问题的两种解决思路

Top K问题在数据分析中非常普遍的一个问题(在面试中也经常被问到),比如: 从20亿个数字的文本中,找出最大的前100个. 解决Top K问题有两种思路, 最直观:小顶堆(大顶堆 -> 最小100个数): 较高效:Quick Select算法. LeetCode上有一个问题215. Kth Largest Element in an Array,类似于Top K问题. 1. 堆 小顶堆(min-heap)有个重要的性质--每个结点的值均不大于其左右孩子结点的值,则堆顶元素即为整个堆的最小值.J

快速排序的两种实现方法(js)

快速排序的基本思想:通过一趟排序,将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序的目的.--------------冒泡的升级版. 分为两种方法:(1)使用两个数组进行存放.(2)使用交换(正宗版本) (1) function quickSort(arr){ if(arr.length<1){ return arr; } var pivotIndex=Math.floor(arr.length/2);//找

C/C++实现快速排序的两种典型代码

快速排序由C. A. R. Hoare在1960年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 第一种典型实现:通过两个游标来遍历整个待排序数组,i指向数组的第一个元素,j指向数组的最后一个元素.先取出数组中的一个数arr[i],将其保存在key中,此时arr[i]空出来了,这时游标j往前移,就可找到大于等于key的数,

LeetCode 143题:Reorder List的分析及两种解题思路

特别说明:参考了很多前辈的文章,整理如下,我只做了重新编码的工作,不能保证代码最优,主要用作交流学习. 题目: 方法1:将链表的每个节点地址保存在指针数组中,利用数组随机访问调整链表. 1 struct ListNode 2 { 3 int val; 4 ListNode *next; 5 ListNode(int x) : val(x), next(NULL) {} 6 }; 7 8 void reorderList(ListNode *head) 9 { 10 if (head == nul

qsort 快速排序的两种写法

qsort函数  qsort(数组名,大小,sizeof,cmp) a-b默认从小到大排序 1. int cmp(const void *a,const void *b){ stu *s1=(stu *)a; stu *s2=(stu *)b; return s1->score-s2->score;}--------------------stu为结构体, 2. int cmp(const void *a,const void *b){stu s1=*(stu *)a;stu s2=*(stu

普通快速排序的两种实现

1 #include<iostream> 2 using namespace std; 3 4 int arr[10] = {1,9,2,5,4,6,3,8,7,1}; 5 6 void dump(int arr[],int cnt) 7 { 8 for(int i=0;i<cnt;i++){ 9 cout<<arr[i]<<" "; 10 } 11 cout<<endl; 12 } 13 14 15 void QSort(int