快速排序又称为分区交换排序,其基本思想是:首先选一个轴值(即比较的基准),将待排序记录分割成独立的两部分,左侧记录的关键码均小于或等于轴值,右侧记录的关键码均大于或等于轴值,然后分别对这两部分重复上述过程,直到整个序列有序。
int qsort(int v[], int left, int right) { int last, i; if(left >= right) //只有一个数据的时候,不用排了 return; swap(v, left, (left+right)/2); //基准点本是中间位置的数据,这里把它换到了第一的位置 last = left; //last以前的都是小于left(基准点)的数据。last是最后一个小于基准点的数据的位置。基准点是left。 for(i=left+1; i<=right; i++) { if(v[i] < v[left]) swap(v, ++last, i); } /* 交换left与last的位置,因为left中保存的是基准点,而前面的一次划分, 已经将比基准点小的数据都放在了下标小于等于last的位置上,而比基准点大的数据, 都放在了last的后面。这里交换后,就保证基准点前面的数据都比他小。 */ swap(v, left, last); //将基准点再放回中间的位置,基准点在last的位置上.这样做的好处是,保存了排序后基准点的位置。 qsort(v, left, last-1); qsort(v, last+1, right); } void swap(int v[], int i, int j) { int temp ; temp = v[i]; v[i] = v[j]; v[j] = temp; }
数据结构书本里的算法,比上面的容易理解,以第一个数值为轴值。
int partition(int v[], int left, int right) { int i = left, j = right; while(i < j) //这个条件很重要 { //以第一个值为基准值 while(i<j && v[i]<=v[j]) j--; //右侧扫描 if(i < j) { swap(v, i, j); i++; } while(i<j && v[i]<=v[j]) i++; //左侧扫描 if(i < j) { swap(v, i, j); j--; } } return i; } void QuickSort(int v[], int left, int right) { int pivot; if(left < right) { pivot = partition(v, left, right); //第一次划分 QuickSort(v, left, pivot-1); //左侧排序 QuickSort(v, pivot+1, right); //右侧排序 } }
最简单易理解的:
void myQuickSort(int v[], int left, int right) { int i,j; i = left - 1; for(j=left; j<=right; j++) { if(v[j] <= v[right]) { i++; swap(v, i, j); } } swap(v, i+1, right); return i+1; }
写算法主要是理解思想,具体形式可以变化很多。自勉之~