快排c语言,C语言快排

1 /*

2 Tue Mar 24 20:07:26 2020

3

4 目的:快速排序

5 结论:快排真难,算法头秃

6 功能:首先取数组首端元素为基准数(temp),先从右往左依次比较出首个

7 比基准数小的元素,再从左往右依次比较出首个比基准数大的元素,两者

8 互换,重复以上操作,注意先右后左,直到i=j,a[i]与基准数互换

9

10 形成新的序列,左边为小于基准数序列,右边为大于基准数序列。

11

12 此时从左侧序列开始重复以上操作,直到左侧序列为升序排列,

13 再从右侧序列开始重复以上操作 ,直到右侧序列为升序排列。

14 左右先后无影响

15

16 程序结束

17 */

18 #include

19 //n:获取数组内容的实际大小

20

21 int a[101],n;

22

23 void quicksort(int left ,int right ) //left数组的首端索引,right数组的尾端索引

24 {

25 /*

26 i: 快排每段分治时的首端索引

27 j: 快排每段分治时的尾端索引

28 temp:基准数

29 */

30 int i, j, t, temp;

31

32 /*

33 这段代码漏了,会导致程序执行到递归时,right不断自减为0,

34 left不变一直为1,left>right,i与j不会变化,

35 程序死循环,无法快排 。

36 */

37 if(left > right)//首端索引大于尾端索引,快排无法进行

38 return;

39

40 //赋值

41

42 temp = a[left];

43 i = left;

44 j = right;

45

46 /*

47 数组索引j为找到比基准数小的值判断a[j]是否大于temp

48 是则递减直到找到a[j]小于基准数。

49 数组索引i为找到比基准数大的值判断a[i]是否小于temp

50 是则递增直到找到a[i]大于基准数。

51 */

52 while(i != j) {

53

54 while(a[j] >= temp && i < j)

55 {

56 j--;

57 }

58 while(a[i] <= temp && i

59 {

60 i++;

61 }

62 /*

63 这样写看似符合快排逻辑,实际上结果是将大数往前排

64 '小数'往后排,是倒序快排,大的往左放,小的往右放。

65 while(a[j] <= temp && i < j) {

66 j--;

67 }

68 while(a[i] >= temp && i

69 i++;

70 }

71 */

72

73 //

74 if(i < j) {

75 t = a[i];

76 a[i] = a[j];

77 a[j]= t;

78 }

79 }

80 //重调基准数

81 a[left] = a[i];//确定新的基准数

82 a[i] = temp;//将前一个基准数置中于序列

83 /*temp=a[i];

84 temp的值由a[left]确立

85 这样写会导致中间序列数无法确认

86 */

87

88 /*

89 左侧序列快排及右侧序列快排

90 先后顺序对结果无影响

91 */

92 quicksort(i+1,right);

93 quicksort(left,i-1);

94

95 }

96 int main () {

97 /*

98 i:控制数组输入输出的次数

99 n:数组实际长度

100 */

101 int i;

102

103 scanf("%d",&n);

104 for(i = 1; i <= n; i++) {

105 scanf("%d",&a[i]);

106 }

107

108 quicksort(1,n);

109

110 for(i = 1; i <= n; i++) {

111 printf("%d",a[i]);

112 }

113 return 0;

114 }

参考链接:https://blog.youkuaiyun.com/vayne_xiao/article/details/53508973?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

标签:right,temp,快排,基准,C语言,索引,left

来源: https://www.cnblogs.com/MoMei25/p/12561876.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值