1,冒泡Bubble:从第0个开始,一直往上,与相邻的元素比较,如果下面的大,则交换。 Analysis: Implementation: void BubbleSort(int *pData, int iNum)
2,插入Insertion:与打扑克牌时整理牌很想象,假定第一张牌是有序的,从第二张牌开始,拿出这张牌来,往下比较,如果有比这张牌大的,则把它拨到上一个位置,直到找到比手上的这张更小的(或到顶了), 则把手上的这张牌插入到这张更小的牌的后面。 Analysis: Implementation: void InsertionSort(int *list, int length) { int i, j, temp; for (i = 1; i < length; i++) { temp = list[i]; j = i - 1; while ((j >= 0) && (list[j] > temp)) { list[j+1] = list[j]; j--; } list[j+1] = temp; } }
3,选择Selection:从所有元素中找到最小的放在0号位置,从其它元素(除了0号元素)中再找到最小的,放到1号位置,......。 Analysis: Implementation: void SelectionSort(int data[], int count) { int i, j, min, temp; for (i = 0; i < count - 1; i++) { /* find the minimum */ min = i; for (j = i+1; j < count; j++) { if (data[j] < data[min]) { min = j; } } /* swap data[i] and data[min] */ temp = data[i]; data[i] = data[min]; data[min] = temp; } }
4,快速Quick:先拿出中间的元素来(值保存到temp里),设置两个索引(index or pointer),一个从0号位置开始往最大位置寻找比temp大的元素;一个从最大号位置开始往最小位置寻找比temp小的元素,找到了或到顶了,则将两个索引所指向的元素 互换,如此一直寻找交换下去,直到两个索引交叉了位置,这个时候,从0号位置到第二个索引的所有元素就都比temp小,从第一个索引到最大位置的所有元素就都比temp大,这样就把所有元素分为了两块,然后采用前面的办法分别排序这两个部分。总的来 说,就是随机找一个元素(通常是中间的元素),然后把小的放在它的左边,大的放右边,对左右两边的数据继续采用同样的办法。只是为了节省空间,上面采用了左右交换的方法来达到目的。 Analysis: Implementation: void QuickSort(int *pData, int left, int right) { int i, j; int middle, iTemp; i = left; j = right;
middle = pData[(left + right) / 2]; //求中间值 do { while ((pData[i] < middle) && (i < right)) //从左扫描大于中值的数 i++;
while ((pData[j] > middle) && (j > left)) //从右扫描小于中值的数 j--;
if (i <= j) //找到了一对值 { //交换 iTemp = pData[i]; pData[i] = pData[j]; pData[j] = iTemp; i++; j--; } } while (i <= j); //如果两边扫描的下标交错,就停止(完成一次)
6,归并Merge:先将所有数据分割成单个的元素,这个时候单个元素都是有序的,然后前后相邻的两个两两有序地合并,合并后的这两个数据再与后面的两个合并后的数据再次合并,充分前面的过程直到所有的数据都合并到一块。 通常在合并的时候需要分配新的内存。 Analysis: Implementation: void Merge(int array[], int low, int mid, int high) { int k; int *temp = (int *) malloc((high-low+1) * sizeof(int)); //申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 int begin1 = low; int end1 = mid; int begin2 = mid + 1; int end2 = high;