快速排序代码,熟记

来源:互联网 发布:windows socket 知乎 编辑:程序博客网 时间:2024/05/21 10:36

一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

 

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h>#define MAXINT 25 int map[MAXINT]; int visit[MAXINT]; int max = 0;void swap(int* x,int* y) {  int tmp;  tmp = *x;  *x = *y;  *y = tmp;  return; }//快速排序法就是把比中间元素tmp小的尽量放在temp前,比temp大的尽量放在temp后//从小到大排列void quicksort(int sta[], int start, int end) {  int i = start;  int j = end;  int tmp = sta[i]; if (start < end) //至少2个元素才会排序 {   while (i<j)   {    while ((j > i) && (sta[j] >= tmp))//这是后半段,如果比tmp大,就一直走知道找到比tmp小的元素   {     j--;    }    sta[i] = sta[j];  //把小的值放到前半段去   while ((i < j) && (sta[i] <= tmp)) //这是前半段,如果比tmp小,就一直往小走知道找到比中间元素大的结束   {     i++;    }    sta[j] = sta[i]; //把这个大的值放在后半段  }  sta[i] = tmp; //把中间节点放到i的位置  //递归  quicksort(sta,start,i-1); //中间的j元素就变成中间元素了  quicksort(sta, i+1, end);     }  return; }void bfs() {  int i = 0;  visit[map[0]] = 1;  return; }int main() {  int i = 0;  int j = 0;  int T = 0;  int n = 0;  freopen("input.txt","r",stdin);  scanf("%d",&T);  for (i = 0; i < T;i++)  {   scanf("%d", &n);   for (j = 0; j < n;j++)   {    scanf("%d",&map[j]);    if (max > map[j])    {     max = map[j];    }   }   //将木棍从大到小排列  quicksort(map,0,n-1);   bfs();  }  return 0; }

 

内部范本

void qsort(Edge a[], int begin, int end){if (begin >= end)return;int l = begin, r = end;Edge k = a[l];while (l < r){while ((l < r) && (a[r].length >= k.length))r--;a[l] = a[r];while ((l < r) && (a[l].length <= k.length))l++;a[r] = a[l];}a[l] = k;qsort(a, begin, l - 1);qsort(a, l + 1, end);}


后来自己又写了一个

#define _CRT_SECURE_NO_WARNINGS//题意先解释下,就是牛都呆在各个编号的牛棚里,然后有固定块数的板,要把牛所呆的地方做门,然后门越长费用越高,所以又要把固定块数用完又要每块板的长度尽可能短//自己的想法是因为输入不一定是有顺序的,先从小到大排序,然后把间隔算出来,然后找出前M个间隔最大的,就从这个前面隔开就好了#include <stdio.h>#define MAXINT 205int M = 0;int N = 0;int C = 0;int map[MAXINT];int grid[MAXINT];void init(){int i = 0;for (i = 0; i < MAXINT;i++){map[i]  = 0;grid[i] = 0;}return;}void quicksort(int start, int end){int i = start;int j = end;int tmp = map[start];//如果start和end相等,说明已经排序结束if (start >= end){return;}while (i < j){//先从j开始就是先从数组的后面开始,遇到比第一个元素小的就停止,然后把两个元素对调while ((i<j)&&(map[j] >= tmp)){j--;}map[i] = map[j];  //这里原来i的位置写成start,大错特错啊//map[j] = tmp;//从i开始找到比第一个元素大的就停止,然后调换while (i<j&&(map[i]<=tmp)){i++;}map[j] = map[i];//map[i] = tmp;}map[i] = tmp; //是到这边赋值的,上面自己那个赋值的地方不对的quicksort(start, i - 1); //这边要写start不是0quicksort(i+1, end); //i是中间元素,不用参与了,后面参加排序的中间元素两边的继续排序,左边是中间元素小的,右边是中间元素大的return;}int main(){int T = 0;int i = 0;int j = 0;freopen("input.txt","r",stdin);scanf("%d",&T);for (i = 0; i < T;i++){init();scanf("%d %d %d",&M,&N,&C);for (j = 0; j < C;j++){scanf("%d",&map[j]);}quicksort(0,C-1); //快排,从小到大排序}return 0;}


 


 

0 0
原创粉丝点击