您的位置:首页 > 其它

快速排序

2013-10-06 16:35 183 查看
以首元素为基准,先从右边向左边扫描,再从左边向右边扫描。将叫小的数移动到前面,较大的数移动到后面,则第一轮过后,

首元素将所有数据分成了左右两部分,让后对左右两部分继续进行相同的操作。

1、

#include<stdio.h>

#include<stdlib.h>

#include<iostream>

using namespace std;

void quicksort(int data[], int low, int high)

{

 int i, pivot, j;

 if(low < high){

  pivot = data[low];

  i = low;

  j = high;

  while(i < j){

   //cout<<"data[j]: "<<data[j]<<endl;

   while(i < j && data[j] >= pivot){

    j--;

   }

   if(i < j){

    data[i++] = data[j];

   }

   while(i < j && data[i] <= pivot){

    i++;

   }

   if(i < j){

    data[j--] = data[i];  //每次的赋值都是填充上一次的基准所在位置元素

   }

  }

  data[i] = pivot;     //将基准赋给

  quicksort(data, low, i - 1);

  quicksort(data, i + 1, high);

 }

}

int main(void)

{

 int i;

 int arr[8];

 printf("Input six number: \n");

 for(i = 0; i < 8; i++){

  scanf("%d", &arr[i]);

 }

 quicksort(arr, 0, 7);

 for(i = 0; i < 8; i++){

  printf("%d ", arr[i]);

 }    

}

2、

//注意if(low<high)这一判断语句,否则不知道终止条件

#include<iostream>

using namespace std;

int partion(int data[],int low ,int high){

  int i,j,k;

  i=low;j=high;k=data[i];

  while(i<j){

   while((i<j)&&data[j]>=k){

    j--;

   }

   data[i++]=data[j];

   while((i<j)&&data[i]<=k){

    i++;

   }

   data[j--]=data[i];

  

  }

  data[i]=k;

  return i;

}

void qsort(int data[],int low,int high){

 

   int temp;

   if(low<high){     //注意这个地方大判断语句特别重要,一定要加

   temp=partion(data,low,high);

   qsort(data,low,temp-1);

   qsort(data,temp+1,high);

   }

}

int main()

{

 int a[5];

 int i;

 for(i=0;i<5;i++){

  scanf("%d",&a[i]);

 }

 qsort(a,0,4);

 for(i=0;i<5;i++){

  printf("%d ",a[i]);

 }

 printf("\n");

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: