现在有数组{ 3, 6, 2, 1, 9, 5, 4, 7 }; 然后用快速排序法把他们排序
1、首先 ,取出3作为比较数据
2、从最右边往左边比较找到第一个比3小的数据,把3在数组中的位置赋值为那个数,这里向左循环到1时,1<3 把1复制到数组的第一个位置,记录此时1的位置,作为下一个填充数据的位置
3、再用3从左向右比较数据,找到第一个比3大的数据,这里是6,把6赋值给从右边比较时1的位置
4、从“1”的位置重复2,3步骤,直到从左边比较时索引 大于等于 从右边比较时的索引结束本次循环 数组变为 1 2 3 6 9 5 4 7
5、第二轮循环,从“3” 位置开始 数组的2索引,经过第一轮分别循环,数组"3"左边的数都比"3"小,右边的数都比“3”大, 数组 1,2 ; 6,9,5,4,7用1,2,3,4步骤再次循环
6、重复上述步骤,下面贴代码
private void quick_sort1(int[] s, int l, int j) { if(l<j) { int i = test1(s, l, j); quick_sort1(s, l, i - ); quick_sort1(s, i+, j); } } private int test1(int []list,int i_start,int i_end) { int i_Now = list[i_start];//取出第一个比较数 int i_front =i_start; //保存从左边遍历的位置 int i_brak = i_end; //保存从右边遍历的位置 ; ii < i_end; ii++) { for (int i = i_brak; i > i_front; i--) //从最右边开始遍历,满足循环到的数大于i_Now(取出的数),比较向左边移动 { if (list[i] < i_Now && i >= i_front)//当遍历到的数小于i_Now(比较数)并且当前位置大于左边遍历的位置 { list[i_front] = list[i]; //把此时的遍历到的数填充到i_Now的位置,这时数组为 1 6 2 1 9 5 4 7 ,(取出来i_Now为3,位置为数组的索引一) i_brak = i; //这时需要填充的新的数字的位置为最开始1的位置,也就是数组索引3的位置 i_front++; //给左边遍历的位置加一,因为数组第一个位置现在有数字了 break; } else { continue; } } for (int j = i_front; j <= i_brak; j++) //从右边遍历结束后再从左边开始遍历,使用的数字依旧为i_Now,此时需要填充的位置为数组索引3的位置 { //从左边数值找到大于i_Now并且索引位置小于第一从从右边循环结束的位置 也就是数组索引为3的位置 if (list[j] > i_Now && i_brak > j) { list[i_brak] = list[j]; //将此时遍历到的数填充到第一次遍历移动数字的初始位置,也就是数组索引为3的位置 i_front = j; //此时数组为 1 6 2 6 9 5 4 7 i_brak--; //给右边遍历的位置减一,因为数组第i_brak个位置现在有数字了 break; } else { continue; } } } // ==》 重复上面的步骤 先从右往左找 数组变为 1 2 2 6 9 5 4 7,从左往右找时发现i_front >=i_brak list[i_front] = i_Now; //这时把最初拿出来的i_Now填充到最后i_font的位置 也就是数组索引2的位置,数组变为1 2 3 6 9 5 4 7 ; i < list.Length; i++) //==》经过第一轮遍历会发现“3”(i_Now)左边的数 都小于3 ,右边的数都大于3 然后继续调用排序方法 { //这时遍历分别遍历"3"两边的数组 ==>int i = test1(s, l, j);quick_sort1(s, l, i - 1);quick_sort1(s, i + 1, j); i为初始数据填充数组的位置 textBox1.Text += list[i].ToString(); textBox1.Text += ","; } textBox1.Text += "\r\n"; return i_front; }
用个按钮触发下
private void button1_Click(object sender, EventArgs e) { ] { , , , , , , , }; quick_sort1(list, , ); }
就这样了 ~~~~~刚刚开始接触,研究算法的菜鸟一枚,欢迎大家帮我指正错误,欢迎共同讨论、、