插入排序:
将一组数据分成两组,将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。
为了排序方便,我们一般将数据第一个元素视为有序组,其他均为待插入组。
升序图解:
void InsertionSort(int *num,int n) { int i = 0; int j = 0; int tmp = 0; for(i = 1;i<n;i++) { tmp = num[i];//从待插入组取出第一个元素。 j = i-1; //i-1即为有序组最后一个元素(与待插入元素相邻)的下标 while(j>=0&&tmp<num[j]) //注意判断条件为两个,j>=0对其进行边界限制。第二个为插入判断条件 { num[j+1] = num[j];//若不是合适位置,有序组元素向后移动 j--; } num[j+1] = tmp;//找到合适位置,将元素插入。 } }*******************************************************************************************************
快速排序:
6 1 2 7 9 3 4 5 10 8
以6为基准数
首先设置两个哨兵i 和 j
i指向第一个元素 ,j指向最后一个元素
每次走的时候j先走
j向左移动寻找比基准数小的数字,找到了停下来
i向右移动寻杂比基准数大的数字,找到了停下来
他们互相进行交换
然后j继续向左移动,直到找到比基准数小的数
i同样也是向右移动,知道找到比基准数大的数
如果他们碰面的话,就将他们碰面时指向的数字和基准数进行交换,此时就完成了第一次的基准数归位。
继续以第一个元素为基准数,继续进行以上的操作,知道所有的基准数归位。
//快速排序void quicksort(int a[],int left,int right){ //left 代表是整个数组的第一个以他为基数 //right 代表是数组的最后一个 int i,j,t,temp; if(left > right) return ; temp = a[left];//基准数 i = left; j = right; while(i != j) { //先从右边开始找 while(a[j] >= temp && i < j) j--; //从右边开始找 while(a[i] <= temp && i < j) i++; //交换两个数在数组中的位置 if(i < j) { t = a[i]; a[i] = a[j]; a[j] = t; } } //基准数归位 a[left] = a[i]; a[i] = temp; quicksort(a,left,i-1);//继续处理左边的-----递归 quicksort(a,i+1,right);//继续处理右边的----递归}
