快速排序

来源:互联网 发布:数据对比用什么图表 编辑:程序博客网 时间:2024/04/30 14:47

思想:以某一元素为基准,将剩余元素拆分为大于该元素和小于该元素的两部分,然后再分别选取基准元素,重复拆分,知道该部分中剩余元素为一个。


#include <stdio.h>//输出void print(int array[], int size){int i = 0;for(i = 0; i < size; i++){printf("%d ", array[i]);}printf("\n");}//交换void swap(int *a, int *b){int temp = *a;*a = temp;*a = *b;*b = temp;}//以end下标元素为基准,拆分从start到end的序列为两部分int partition(int array[], int start, int end){int midVal = array[end];  //基准元素int i = 0;int len = end - start + 1;//遍历序列长度int index = start - 1;  //标记交换位置for(i = start; i < end; i++){/* 小于基准元素的数在前半部分,大于基准元素的数在后半部分 (小于基准元素[start, x])(大于基准元素[x + 1, end - 1])(基准元素 [end]) */if(array[i] < midVal)//如果小于基准元素则需进行交换{index++;swap(&array[i], &array[index]);}}//将基准元素放到中间,如果全部小于基准元素,则基准元素位置不变//如果全部大于基准元素,则位置变为起始位置//其他在中间某位置//index是大于基准元素的第一个元素的下标swap(&array[index + 1], &array[end]);return index + 1;}void quickSort(int array[], int start, int end){int i = 0;if(end <= start){return;}else{i = partition(array, start, end); //返回索引//继续拆分,上一次基准元素已排好序,可忽略quickSort(array, start, i - 1); quickSort(array, i + 1, end);}}int main(){int array[] = {12, 4, 345, 65, 78, 23, 0, 54, 23, 56, 100};print(array, 11);quickSort(array, 0, 10);print(array, 11);}




0 0
原创粉丝点击