基础篇,排序(冒泡排序,快速排序)
快速排序的基本思想:挖坑填数+分治法
- 从序列当中选择一个基准数(pivot)
在这里我们选择序列当中第一个数最为基准数
- 将序列当中的所有数依次遍历,比基准数大的位于其右侧,比基准数小的位于其左侧
- 重复步骤1.2,直到所有子集当中只有一个元素为止。
用伪代码描述如下:
1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中
//左分区 < 基准 < 右分区 void qsort(int *array, int left,int right) { if(left < right) { int point = array[left];//设置基准 int low = left; //设置分区最左值 int hight = right; //设置分区最右值 // cout<<point<<low<<hight<<endl; while(low < hight) { while((low<hight) && (point <= array[hight])) --hight; // cout<<hight<<endl; array[low] = array[hight]; //找到右分区比基准值小的,替换基准值元素原有数据 while((low<hight) && (point > array[low])) ++low; //找到左分区比基准值大的值,替换该值元素到原来 hight的位置 // cout<<low<<endl; array[hight] = array[low]; //找到右分区比基准值小的,替换基准值元素原有数据 } array[low] = point; qsort(array, left, low-1); qsort(array, low+1, right); } } int main() { int a[] = {2,4,6,23,56,25,8,21,32,5,7,9}; int lenght = sizeof(a)/sizeof(int)-1; cout<<lenght<<endl; qsort(a, 0, lenght); for(int i=0; i<lenght;++i) { cout<<a[i]<<" "; } cout<<" "<<endl; }
冒泡排序思路比较简单: 将序列当中的左右元素,依次比较,保证右边的元素始终大于左边的元素; ( 第一轮结束后,序列最后一个元素一定是当前序列的最大值;) 对序列当中剩下的n-1个元素再次执行步骤1。 对于长度为n的序列,一共需要执行n-1轮比较 (利用while循环可以减少执行次数) *代码实现 #冒泡排序 def bubble_sort(L): length = len(L) #序列长度为length,需要执行length-1轮交换 for x in range(1,length): #对于每一轮交换,都将序列当中的左右元素进行比较 #每轮交换当中,由于序列最后的元素一定是最大的,因此每轮循环到序列未排序的位置即可 for i in range(0,length-x): if L[i] > L[i+1]: temp = L[i] L[i] = L[i+1] L[i+1] = temp
每一成功的背后都有个人的努力和家人的支持