快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是: 1)设置两个变量I、J,排序开始的时候:I=0,J=N-1; 2)以第一个数组元素作为关键数据,赋值给 key,即 key=A[0]; 3)从I开始向后搜索,即由前开始向后搜索(I=I+1即I++),找到第一个大于 key的A[i],A[i]与A[j]交换; 4)从J开始向前搜索,即由后开始向前搜索(J=J-1即J--),找到第一个小于 key的值A[j],A[j]与A[i]交换; 5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后另循环结束。)下面是一个实现:
quick_sort.h
/************************************************************************/ /* 快速排序的思想就是将待排序列分成两部分,即选取一个枢轴,他的左面部分皆小于他,他的右面皆大于他,然后递归对左右部分分别按此法进行,*/ /* 即可达到排序目的*/ /************************************************************************/ /* 交换元素 */ void swap_item(int a[], int l, int r ); /* 将数字分成左右两部分,返回枢轴的位置, 这里有两种方式, 一是设置两个游标low,high,low从前向后查找比pivotKey大的,然后 交换,high从后向前查找比pivotKey小的,然后交换 二是从前向后查找,找到比pivotKey大的则交换pivotKey和该元素 */ int partion(int a[], int low, int high); /* 递归执行.a[0.....high] */ void quick_sort(int a[], int low, int high);
#include "Quick_Sort.h" void swap_item(int a[], int l, int r ) { int temp = a[l]; a[l] = a[r]; a[r] = temp; } int partion(int a[], int low, int high) { int i = low, j = high, pivotKey = a[low]; if (low < high)//是否只有一个元素 { while( i < j)//分组 { while( i < j && a[j] >= pivotKey)//从后向前找到比pivotKey小的 j--; if ( i < j)//交换 { a[i++] = a[j]; } while ( i < j && a[i] <= pivotKey)//从前向后找到比pivotKey大的 { i++; } if ( i < j)//交换 { a[j--] = a[i]; } }/*while*/ //{ //有问题,还需改正 // int keyIndex = low; // for (int j = low + 1; j < high + 1; j++) // { // if (a[j] <= pivotKey)//则与i交换位置 // { // swap_item(a, keyIndex, j); // keyIndex = j; // } // } //} a[i] = pivotKey; } return i; } void quick_sort(int a[], int low, int high) { if (low < high )//至少两个元素 { int i = partion(a, low, high); quick_sort(a, low, i -1); quick_sort(a, i+1, high); } }