基础篇,排序(冒泡排序,快速排序)

快速排序的基本思想:挖坑填数+分治法
  1. 从序列当中选择一个基准数(pivot)
在这里我们选择序列当中第一个数最为基准数
  1. 将序列当中的所有数依次遍历,比基准数大的位于其右侧,比基准数小的位于其左侧
  2. 重复步骤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
原文地址:https://www.cnblogs.com/Lijcyy/p/13837278.html