zoukankan      html  css  js  c++  java
  • 快速排序算法记录

    快速排序不是一种稳定的排序算法
     
    设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。
    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-完成的时候,此时令循环结束)。
     
    main.cpp:
      1 #include <iostream>
      2 #include <cstdlib>
      3 
      4 using namespace std;
      5 
      6 #define N 100
      7 
      8 void Upsort(int a[], int left, int right)
      9 {
     10     if (left >= right)
     11     {
     12         return;
     13     }
     14 
     15     int i = left;
     16     int j = right;
     17     int key = a[left];
     18 
     19     while(i < j)
     20     {
     21         while(i<j && key <= a[j])
     22         {
     23             j--;
     24         }
     25 
     26         a[i] = a[j];
     27 
     28         while (i<j && key >= a[i])
     29         {
     30             i++;
     31         }
     32 
     33         a[j] = a[i];    
     34     }
     35 
     36     a[i] = key;
     37 
     38     Upsort(a,left,i-1);
     39     Upsort(a,i+1,right);
     40 }
     41 
     42 void Downsort(int a[], int left, int right)
     43 {
     44     if (left >= right)
     45     {
     46         return;
     47     }
     48 
     49     int i = left;
     50     int j = right;
     51     int key = a[right];
     52 
     53     while(i < j)
     54     {
     55         while (i<j && key <= a[i])
     56         {
     57             i++;
     58         }
     59 
     60         a[j] = a[i];
     61 
     62         while(i<j && key >= a[j])
     63         {
     64             j--;
     65         }
     66 
     67         a[i] = a[j];    
     68     }
     69 
     70     a[j] = key;
     71     
     72     Downsort(a,left,j-1);
     73     Downsort(a,j+1,right);
     74 }
     75 
     76 void UpDownsort(int a[], int left, int right, bool Up)
     77 {
     78     if (Up)
     79     {
     80         Upsort(a,left,right);
     81     }
     82     else
     83     {
     84         Downsort(a,left,right);
     85     }
     86 }
     87 
     88 int main()
     89 {
     90     int a[N];
     91     for(int i = 0; i<N; i++)
     92     {
     93         a[i] = rand();
     94     }
     95     
     96     UpDownsort(a,0,N-1,false);
     97 
     98     for(int i=0; i<N; i++)
     99     {
    100         cout<<a[i]<<"	";
    101     }
    102     
    103     return 0;
    104 }
  • 相关阅读:
    这样的面试题你会吗
    5个强盗分100颗宝石 你该怎么分?
    《Java程序员全攻略:从小工到专家》连载十四:先挣的是资本,后挣的是钱
    不是三维——软件项目的设计、开发与管理
    《Java程序员职场全攻略:从小工到专家》连载十三:给自己估个好价
    程序开发心理学
    电子工业出版社博文视点图书在微软VS2010全球发布会上受追捧
    博文视点大讲堂25期——2天玩转单反相机
    《Java程序员职场全攻略:从小工到专家》连载十五:我们不是爱加班
    管理小品(1)
  • 原文地址:https://www.cnblogs.com/Jace-Lee/p/6026536.html
Copyright © 2011-2022 走看看